【问题标题】:Calling template pointer to member function调用指向成员函数的模板指针
【发布时间】:2023-03-28 19:37:01
【问题描述】:

我正在开发一个 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_) (...)'|

【问题讨论】:

    标签: c++ function templates pointers


    【解决方案1】:

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

    可能是这样的:

    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_;
    };
    

    【讨论】:

    • (obj-&gt;*func_)();(obj.*func_)() 如果你有一个对象而不是指向它的指针。
    【解决方案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)(); 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 2012-07-05
      • 1970-01-01
      • 2011-12-09
      • 2012-05-21
      相关资源
      最近更新 更多