Понемножку перехожу с си на c++. У меня возникла такая проблема. Вот класс.
class Model {
private:
void draw_with_texture ( void );
void draw_without_texture ( void );
void (*map) ( void );
void switch_to ( void );
public:
Sprite *texture;
};
Ну и где-то в коде проверяю.
void Model::switch_to ( ) {
if ( this->texture ) this->map = draw_with_texture;
else this->map = draw_without_texture;
}
Если бы я писал на си, то проблем бы не было, потому что не в классе производится операция.
./src/engine/model.cpp: In member function ‘void Model::switch_to()’:
./src/engine/model.cpp:12:35: error: cannot convert ‘Model::draw_with_texture’ from type ‘void (Model::)()’ to type ‘void (*)()’
if ( this->texture ) this->map = draw_with_texture;
^~~~~~~~~~~~~~~~~
./src/engine/model.cpp:13:19: error: cannot convert ‘Model::draw_without_texture’ from type ‘void (Model::)()’ to type ‘void (*)()’
else this->map = draw_without_texture;
Можно ли решить мою проблему и как?
Указатель на ваши функции в классе должен иметь тип void (Model::*)()
, а вы его объявили с типом void (*)()
. Это совершенно разные, никак не совместимые типы.
Правильно
void (Model::*map) ( void );
(если уж вам нравится писать void
в скобках).
Ну и, разумеется, при вызове надо учитывать, что вызов производится не через указатель на свободную функцию, а через указатель на метод класса.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Подскажите, что означает оператор расширения области видимости, который ставится перед идентификатором?
Хотел сверстать страницу, которая будет похожа на картинкуКак можно размещать элементы не по прямой линии, а по кривой?) чтобы можно было...
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском
Имеется экземпляр объекта и строка с текстовым представлением "адреса" свойства объектаНапример: