указатель на функцию в классе

116
15 сентября 2021, 05:20

Понемножку перехожу с си на 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;

Можно ли решить мою проблему и как?

Answer 1

Указатель на ваши функции в классе должен иметь тип void (Model::*)(), а вы его объявили с типом void (*)(). Это совершенно разные, никак не совместимые типы.

Правильно

void (Model::*map) ( void );

(если уж вам нравится писать void в скобках).

Ну и, разумеется, при вызове надо учитывать, что вызов производится не через указатель на свободную функцию, а через указатель на метод класса.

READ ALSO
C++, namespace и оператор расширения видимости

C++, namespace и оператор расширения видимости

Подскажите, что означает оператор расширения области видимости, который ставится перед идентификатором?

127
Как расположить элементы в html не по сетке?

Как расположить элементы в html не по сетке?

Хотел сверстать страницу, которая будет похожа на картинкуКак можно размещать элементы не по прямой линии, а по кривой?) чтобы можно было...

83
Консольный ввод/вывод C# [закрыт]

Консольный ввод/вывод C# [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

89
Как получить тип значения свойства объекта по его адресу? [дубликат]

Как получить тип значения свойства объекта по его адресу? [дубликат]

Имеется экземпляр объекта и строка с текстовым представлением "адреса" свойства объектаНапример:

146