当我尝试将指向成员函数的指针用于其他类时,我有这个错误。
Error : sources/common/OurMenu.cpp: In member function ‘void OurMenu::menuNavigation()’: sources/common/OurMenu.cpp:336:36: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘((OurMenu*)this)->OurMenu::_buttons.std::vector::at >(((std::vector::size_type)((OurMenu*)this)->OurMenu::_actualLine))->Button::doIt (...)’, e.g. ‘(... ->* ((OurMenu*)this)->OurMenu::_buttons.std::vector::at >(((std::vector::size_type)((OurMenu*)this)->OurMenu::_actualLine))->Button::doIt) (...)’ _buttons.at(_actualLine)->doIt();
那是我的代码:
OurMenu.hh
.modal
Button.hh
class OurMenu
{
private:
GraphicLib *_window;
OurGame *_game;
gdl::Geometry _background;
std::vector<gdl::Texture*> _textures;
std::vector<Button*> _buttons;
int _actualLine;
int _time;
public:
[...]
void menuNavigation();
void gameSetting();
};
按钮声明
class Button
{
private:
Bloc *_select;
Bloc *_notSelect;
public:
Button(const float &x, const float &y, gdl::Geometry *back,
gdl::Texture *tx, gdl::Texture *txS, glm::vec3 const &scale, void (OurMenu::*ptr)());
~Button();
void (OurMenu::*doIt)();
void isSelect();
void isDeselect();
Bloc *getSelect() const;
Bloc *getNotSelect() const;
};
函数调用
Button *solo = new Button(2, 7, &_background, _textures.at(1), _textures.at(7),
glm::vec3(0.0025, 0.0022, 0), &OurMenu::gameSetting);
Button.cpp
solo->doIt();
答案 0 :(得分:0)
在您的情况下,看起来您正在尝试
(solo->doIt)(); // need the parentheses here
其中solo
的类型为Button*
,但doIt
是指向void (OurMenu::*)()
类型的成员函数的指针。它不会起作用,因为在你的OurMenu
案例中,必须在相同类型的实例上调用指向成员函数的指针。如果solo
可以投放到OurMenu
(可能不是),则可以
(static_cast<OurMenu*>(solo)->doIt)();
否则你应该改变你的设计。看起来您想从Button
实例调用菜单功能。如果是这样,您需要在OurMenu
中创建Button
的实例,并在该实例上调用指针,如
OurMenu menu; // this is created somewhere in Button
(menu.*doIt)();