在另一个 class 中声明并使用指向成员函数的指针
Declare and use a pointer to member function in another class
我有这个错误,当我尝试使用指向不同 class 的成员函数的指针时。
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
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();
};
Button.hh
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);
函数调用
solo->doIt();
Button.cpp
Button::Button(const float &x, const float &y, gdl::Geometry *back,
gdl::Texture *tx, gdl::Texture *txS, glm::vec3 const &scale, void (OurMenu::*ptr)())
{
_select = new Bloc(0, 0, back, txS);
_select->rotate(glm::vec3(1, 1, 0), 180);
_select->setScale(scale);
_select->setX(x);
_select->setY(y);
_select->setZ(1);
_notSelect = new Bloc(0, 0, back, tx);
_notSelect->rotate(glm::vec3(1, 1, 0), 180);
_notSelect->setScale(scale);
_notSelect->setX(x);
_notSelect->setY(y);
_notSelect->setZ(-1);
doIt = ptr;
}
在你的情况下,看起来你正在尝试
(solo->doIt)(); // need the parentheses here
其中 solo
是类型 Button*
,但是 doIt
是指向类型 void (OurMenu::*)()
的成员函数的指针。它不会工作,因为必须在相同类型的实例上调用指向成员函数的指针,在您的情况下 OurMenu
。如果 solo
可以转换为 OurMenu
(可能不是),你可以
(static_cast<OurMenu*>(solo)->doIt)();
否则你要么改变你的设计。看起来您想从 Button
实例调用菜单功能。如果是这样,您需要在 Button
中创建 OurMenu
的实例,并调用该实例上的指针,例如
OurMenu menu; // this is created somewhere in Button
(menu.*doIt)();
我有这个错误,当我尝试使用指向不同 class 的成员函数的指针时。
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
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();
};
Button.hh
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);
函数调用
solo->doIt();
Button.cpp
Button::Button(const float &x, const float &y, gdl::Geometry *back,
gdl::Texture *tx, gdl::Texture *txS, glm::vec3 const &scale, void (OurMenu::*ptr)())
{
_select = new Bloc(0, 0, back, txS);
_select->rotate(glm::vec3(1, 1, 0), 180);
_select->setScale(scale);
_select->setX(x);
_select->setY(y);
_select->setZ(1);
_notSelect = new Bloc(0, 0, back, tx);
_notSelect->rotate(glm::vec3(1, 1, 0), 180);
_notSelect->setScale(scale);
_notSelect->setX(x);
_notSelect->setY(y);
_notSelect->setZ(-1);
doIt = ptr;
}
在你的情况下,看起来你正在尝试
(solo->doIt)(); // need the parentheses here
其中 solo
是类型 Button*
,但是 doIt
是指向类型 void (OurMenu::*)()
的成员函数的指针。它不会工作,因为必须在相同类型的实例上调用指向成员函数的指针,在您的情况下 OurMenu
。如果 solo
可以转换为 OurMenu
(可能不是),你可以
(static_cast<OurMenu*>(solo)->doIt)();
否则你要么改变你的设计。看起来您想从 Button
实例调用菜单功能。如果是这样,您需要在 Button
中创建 OurMenu
的实例,并调用该实例上的指针,例如
OurMenu menu; // this is created somewhere in Button
(menu.*doIt)();