[英]How to forward declare a member function of a class to use in another class?
[英]Declare and use a pointer to member function in another 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
為OurMenu
(可能不是),則可以執行
(static_cast<OurMenu*>(solo)->doIt)();
否則,您應該更改設計。 看起來您想從Button
實例調用菜單功能。 如果是這樣,則需要在Button
創建OurMenu
的實例,並在該實例上調用指針,例如
OurMenu menu; // this is created somewhere in Button
(menu.*doIt)();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.