Некоторые из этих ответов не работали так, как написано с Python 3, или не дали правильного представления для отрицательных чисел с плавающей запятой. Я нашел следующее для работы для меня (хотя это дает 64-битное представление, которое мне нужно)
def float_to_binary_string(f):
def int_to_8bit_binary_string(n):
stg=bin(n).replace('0b','')
fillstg = '0'*(8-len(stg))
return fillstg+stg
return ''.join( int_to_8bit_binary_string(int(b)) for b in struct.pack('>d',f) )
Ваша проблема состоит в том, что необходимо принять ссылку в функции. Причина состоит в том, что ссылка на самом деле не копирует переданный аргумент. Если Вы однако принимаете A
- вместо ссылки A&
- тогда Вы на самом деле копируете аргумент, переданный в объект параметра, и что Вы получаете, объект типа A
- но который на самом деле не позволяется!
// the reference parameter will reference the actual argument
void setInstance(A &newInstance) {
// assign the address of the argument to the pointer member
// instance.
instance = &newInstance;
}
И затем необходимо будет изменить участника в классе, чтобы быть указателем. Это не может быть ссылка, потому что setInstance
изменит то, на что это ссылается - ссылка может только сослаться на один объект в течение своего всего времени жизни, в то время как указатель может быть установлен указать, делают разные вещи только путем переприсвоения ему другого адреса. Остающиеся части похожи на это тогда
void doSomething() {
// call a member function on the object pointed to
// by instance!
instance->action();
}
private:
// a pointer to some object derived from A
A *instance;
Также примечание, которое необходимо скомпилировать программы C++ с помощью g++
, потому что оно дополнительно связывает библиотеку стандарта C++ с кодом
g++ -o test test.cpp # instead of gcc!
То, что Вы делаете, работало бы в Java, потому что объявление параметра или членской переменной типа "A" действительно означает "указатель на A". В C++ на самом деле необходимо быть явными об этом, так как они - две разных вещи:
void setInstance(A* newInstance) { // pointer to an "A"
instance = newInstance;
}
И в объявлении:
A* instance; // Not an actual "A", but a pointer to an "A"
Вашей проблемой теперь является связь. Для программы C++ должна быть добавлена стандартная библиотека C++:
gcc-o тест -lstdc ++ test.cpp
Я полагаю, что это - то, что Вы пытаетесь сделать. Это демонстрирует полиморфизм путем фактического распечатывания чего-то в зависимости от того, указывает ли класс дескриптора на экземпляр B или C. Другие корректны, что Вы, вероятно, также хотели бы виртуальный деструктор.
Это компилирует с: g ++ test.cpp-o Тест
#include <stdio.h>
class A {
public:
virtual void action() = 0;
};
class B : public A {
public:
B() {}
void action() {
printf("Hello World\n");
}
};
class C : public A {
public:
C() {}
void action() {
printf("Goodbye World\n");
}
};
class AHandleClass {
public:
void setInstance(A *A_Instance) {
APointer = A_Instance;
}
void doSomething() {
APointer->action();
}
private:
A *APointer;
};
int main(int argc, char** argv) {
AHandleClass AHandle;
B BInstance;
C CInstance;
AHandle.setInstance(&BInstance);
AHandle.doSomething();
AHandle.setInstance(&CInstance);
AHandle.doSomething();
return 0;
}
Необходимо сохранить как указатель.
A* instance;
Редактирование: я записал "ссылку" прежде. Существует различие в C++.
Вы не должны использовать указатели , если Вы уходите в отставку метода set и используете конструктора. Это - одна из важных функций в C++: основные инициализаторы в конструкторах часто позволяют избегать использования указателей.
class MyClass {
public:
MyClass(A & newInstance) : instance(newInstance) {
}
void doSomething() {
instance.action();
}
private:
A & instance;
};
int main(int argc, char** argv) {
B myInstance;
MyClass c(myInstance);
Необходимо использовать указатель на как член MyClass.
class MyClass {
public:
void setInstance(A *newInstance) {
instance = newInstance;
}
void doSomething() {
instance->action();
}
private:
A *instance;
};
, если Вы не делаете этого, конструктор MyClass попытается инстанцировать объекта (как он был бы для любого членского объекта), который не возможен, так как A абстрактен.
Когда Вы скажете
A instance;
, Вы создадите новый объект типа A. Но Вы уже сказали, что isa абстрактный класс, таким образом, Вы не можете к этому. Необходимо использовать указатель, как несколько других указали или делают некраткий обзор.
Dmitry корректен, необходимо использовать-lstdc ++, если Вы используете gcc, но еще лучше должны использовать g++
вместо этого. (Тот же синтаксис).
кроме того, Вы отметили бы (я предполагаю, добавляете ли Вы - Стена), что Вы получаете предупреждение, что Ваш класс с виртуальными функциями без деструктора, таким образом, хорошая идея состоит в том, чтобы добавить (виртуальный) деструктор к также.