类设计调用另一个类的成员函数

时间:2018-03-22 09:45:39

标签: c++

我正在尝试设计两个类,这样我就可以从另一个类调用其他类的成员函数并传递一个字符串参数。

例如,如果我有两个类classAclassB。我希望能够使用Class::doSomething方法调用ClassB::ClassB_doit方法。

我尝试通过ClassA registerCallback传递ClassB::classB_doit()方法并将其存储在对B类的引用中。

我试过附加的代码。但是,我不知道如何实现这一目标。有人能指出我正确的方向吗?

#include <iostream>
#include <string>

class classB;

class classA {
public:
    classA ();
    ~classA ();
    void doSometing(std::string s) {
        x ();  // call member function in defined via registerCallback
    }
    void registerCallback(classB &t) {
        x = t;  // Store reference to member function
    }
private:
    classB & x;
};

class classB {
public:
    classB ();
    ~classB ();
    void classB_doit (std::string name) {
        std::cout << name << std::endl;
    }
};
int main(int argc, const char * argv[]) {

    classA A = classA();
    classB B = classB();
    A.registerCallback (B.classB_doit);
    A.doSometing("hello");   // Just to test call doSometing to force classB::classB_doit to be call
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您可以使用pointer to member function。另外,必须在初始化期间绑定引用,并且不能更改绑定到的对象,因此可以改为使用指针。

class classA {
public:
    classA ();
    ~classA ();
    void doSometing(std::string s) {
        (x->*p)(s);  
    }
    void registerCallback(classB &t, void (classB::* _p)(std::string)) {
        x = &t;  
        p = _p;
    }
private:
    classB* x; // pointer instead of reference
    void (classB::* p)(std::string); // store pointer to member function
};

您可以像这样注册对象和成员函数:

A.registerCallback (B, &classB::classB_doit);