调用模板指针指向成员函数

时间:2013-11-06 13:48:03

标签: c++ function templates pointers

我在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_) (...)'|

2 个答案:

答案 0 :(得分: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_;
};

答案 1 :(得分: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)(); 
}