Понемножку перехожу с си на 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
в скобках).
Ну и, разумеется, при вызове надо учитывать, что вызов производится не через указатель на свободную функцию, а через указатель на метод класса.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Подскажите, что означает оператор расширения области видимости, который ставится перед идентификатором?
Хотел сверстать страницу, которая будет похожа на картинкуКак можно размещать элементы не по прямой линии, а по кривой?) чтобы можно было...
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском
Имеется экземпляр объекта и строка с текстовым представлением "адреса" свойства объектаНапример: