为什么我不能在C ++中跨类将函数作为参数传递?

问题描述 投票:1回答:2

所以我试图在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);
                    ^~~~~~~~

而且我不知道为什么。有任何想法吗?我显然做错了什么...只是不确定。任何帮助将不胜感激。谢谢!

c++ function class parameters parameter-passing
2个回答
4
投票

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

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

2
投票

这些函数是成员函数,它们不是静态的。我建议您使用std :: function和std :: bind。通过这些,您将能够将函数作为参数。请记住,当您将使用std :: bind传递参数时,它不是静态/全局函数,而是某个对象的成员,则还需要使用称为放置的东西。查一下您无需使用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;
}
© www.soinside.com 2019 - 2024. All rights reserved.