簡體   English   中英

聲明並使用指向另一個類中成員函數的指針

[英]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

其中soloButton*類型,但是doIt是指向void (OurMenu::*)()類型的成員函數的指針。 這將不起作用,因為在您的情況下,必須在相同類型的實例上調用指向成員函數的指針OurMenu 如果solo可以OurMenuOurMenu (可能不是),則可以執行

(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM