为什么我不能在C ++中的类之间传递函数作为参数?

时间:2014-04-22 16:31:45

标签: c++ function class parameters parameter-passing

所以我试图在C ++的两个类中传递函数作为参数:

void class1::func_1(QString str)
{
    class2* r = new class2();
    r->func_2(str, &process);
}

void class1::process(QString str)
{
     //Do something with str
}

其中'r-> func_2'如下所示:

QString class2::func_2(QString str, void (*callback)(QString))
{
   //Do something else
}

然而,当我尝试编译时,我收到以下错误:

must explicitly qualify name of member function when taking its address
    r->func_2(str, &process);
                    ^~~~~~~~
                     class1::

cannot initialize a parameter of type 'void (*)(QString)' with an rvalue of type 'void (class1::*)(QString)'
    r->func_2(str, &process);
                    ^~~~~~~~

我无法弄清楚原因。有任何想法吗?我显然做错了什么......只是不确定是什么。任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:4)

传递地址时,您需要完全限定成员函数名称:

void class1::func_1(QString str)
{
    class2* r = new class2();
    r->func_2(str, &class1::process);
}

答案 1 :(得分:1)

这些函数是成员函数,它们不是静态的。我建议你使用std :: function和std :: bind。通过这些,您将能够将函数作为参数。请记住,当您使用std :: bind来传递int参数时,它不是静态/全局函数,而是某个对象的成员,您还需要使用这个名为placement的东西。仔细看看。顺便说一句,你不需要使用lambda。

class A
{
    std::string m_name;
    void DisplayName() { std::cout << m_name };
}

void TakeFunctionAsArgument(std::function<void(void)> func)
{
    func();
}

int main()
{
    A objectA;
    TakeFunctionAsArgument(std::bind(&A::DisplayName, objectA));
    return 0;
}