【问题标题】:How can I call a non-static member function of a class from a static member function of another class?如何从另一个类的静态成员函数调用一个类的非静态成员函数?
【发布时间】:2021-03-15 11:54:26
【问题描述】:

我有一个带有静态函数的类(它必须是静态的),它必须调用其他类实例的一些注册成员函数:

class MyCalledClass
{
    MyCallerClass& caller;
    void functionToCall();
    void register()
    {
        caller.setFunctionToCall(&MyCalledClass::functionToCall);
    }
    MyCalledClass(MyCallerClass& mcc,...):caller{mcc}
    {
        register();
    }
}

class MyCallerClass
{
    static void (MyCalledClass::*pointerToMember)();
    
    static void call()
    {
        *pointerToMember();
    }

    void setFunctionToCall(void (MyCalledClass::*pt)())
    {
        pointerToMember = pt;
    }
}
/*...*/
MyCallerClass caller{...};
MyCalledClass called{caller,...};

为什么编译器在 MyCallerClass::call 中的 pointerToMember() 调用中显示“在指向成员的指针上无效使用一元 ''”? 不允许将 pointerToMember 设置为非静态,因为它在静态成员函数中使用。 删除 '' 运算符我得到错误“必须使用 '.' 或 '->*' 来调用 'MyCallerClass::pointerToMember (...)' 中的指针到成员函数,所以我想缺少参考,但我不明白是哪一个。 缺少什么样的参考?

【问题讨论】:

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


    【解决方案1】:

    发现缺少的引用是对MyCalledClass实例的引用,所以我这样修改代码:

    class MyCalledClass
    {
        MyCallerClass& caller;
        void functionToCall();
        void register()
        {
            caller.setFunctionToCall(&MyCalledClass::functionToCall);
        }
        MyCalledClass(MyCallerClass& mcc,...):caller{mcc}
        {
            register();
        }
    }
    
    class MyCallerClass
    {
        static void (MyCalledClass::*pointerToMember)();
        static MyCalledClass* calledInstance;
        
        static void call()
        {
            calledInstance->*pointerToMember();
        }
    
        void setFunctionToCall(void (MyCalledClass::*pt)(), MyCalledClass* ptToCalled)
        {
            calledInstance = ptToCalled;
            pointerToMember = pt;
        }
    }
    /*...*/
    MyCallerClass caller{...};
    MyCalledClass called{caller,...};
    

    欢迎就如何改进此解决方案或其他方法提出建议。

    【讨论】:

    • 不清楚为什么被调用者需要有调用者的引用。如果动作是由调用者对象触发的,只需传递指向该方法的 std::function 并减少耦合。如果动作是由被调用者触发的,你应该问问自己是否在重新发明观察者模式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 2014-04-14
    相关资源
    最近更新 更多