1

我正在开发一个 GUI,我希望能够将函数指针传递给我的按钮,但是,这些可以从不同类型的类中调用,这就是我让它使用模板的原因。

我确实相信它正确存储了函数指针,但我无法正确调用它。

class MainMenuScene: public Scene
{
    public:
        void add_button(){
            void (MainMenuScene::*func)();
            func = &MainMenuScene::test;
            Button b(func);
            b.click();
        }
        void test();
    private:
        GUI<MainMenuScene> gui;
};


template<class T>
class Button: public GUI_object{
public:
    Button(void (T::*func)());
    void click(){
        func_();
private:
    void (T::*func_)();
};

这是我得到的错误:

Button.h|23|error: must use '.*' or '->*' to call pointer-to-member function 
in '((Button<MainMenuScene>*)this)->Button<MainMenuScene>::func_ (...)', 
e.g. '(... ->* ((Button<MainMenuScene>*)this)->Button<MainMenuScene>::func_) (...)'|
4

2 回答 2

3

您存储指针的函数不是静态函数,因此您需要一个对象实例来调用它。

可能是这样的:

class MainMenuScene: public Scene
{
    public:
        void add_button(){
            void (MainMenuScene::*func)();
            func = &MainMenuScene::test;
            Button<MainMenuScene> b(this, func);
            b.click();
        }
        void test();
    private:
        GUI<MainMenuScene> gui;
};


template<class T>
class Button: public GUI_object{
public:
    Button(T* obj, void (T::*func)());
    void click(){
        (obj_->*func_)(); }
private:
    void (T::*func_)();
    T* obj_;
};
于 2013-11-06T14:01:31.240 回答
2

成员函数指针必须用于特定对象。例如,在您的情况下,您需要一个MainMenuScene对象来调用您的函数指针。

例子:

class MainMenuScene
{
public:
    void test() {
        std::cout << "Hello!" << std::endl;   
    }
};


int main()
{

    void (MainMenuScene::*myPointerToMember)() = &MainMenuScene::test;

    MainMenuScene myObj{};
    MainMenuScene* myObjP = &myObj;

    (myObj.*myPointerToMember)();  //Parentheses around (myObj.*myPointerToMember) are important
    (myObjP->*myPointerToMember)(); 
}
于 2013-11-06T14:07:11.027 回答