声明并使用指向另一个类中的成员函数的指针

时间:2015-06-02 15:36:53

标签: c++ pointers function-pointers member-function-pointers

当我尝试将指向成员函数的指针用于其他类时,我有这个错误。

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();

1 个答案:

答案 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)();