在另一个 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)();