c++ - 如何将一个类的函数作为另一个类的另一个函数的参数传递

标签 c++

我创建了一个类Base,它有一个函数addSuccessor(),它将函数的地址作为参数并将其存储在后继者中。如何在 addSuccessor() 中传递另一个对象的函数。 这是我的程序。我认为我的 main() 有一些错误。

#include <iostream>
#include<vector>
using namespace std;
class Base{
public:
    void (*successor)()=NULL;
    void addSuccessor ( void (*f)() )
    {
        successor=f;
    }
    void start()
    {
        cout<<"In Class"<<endl;
        if(!successor==NULL)
            successor();
        else
            cout<<"No Successor"<<endl;
    }
};
class Second{
    public:
    void foo()
    {
        cout<<"Successor";
    }
};

int main()
{
    Base obj;
    Second obj2;

    obj.addSuccessor(&obj2.foo());
    obj.start();

}

最佳答案

函数指针非常有限。使用 std::function (在 header <functional> 中定义),它可以以类型删除的方式存储任何可调用对象,并提供模板成员函数来设置仿函数,其中 perfect forwarding用于将提供的仿函数转发到 successor : ( std::forward 在 header <utility> 中定义)

class Base {
    std::function<void()> successor;
public:
    template <typename F>
    void add_successor(F&& f)
    {
        successor = std::forward<F>(f);
    }
    void start()
    {
        if (successor) {
            successor();
        } else {
            std::cout << "No Successor\n";
        }
    }
};

然后,你可以传递一个lambda expressionadd_successor :

obj.add_successor([&]{ obj2.foo(); });

( live demo )

关于c++ - 如何将一个类的函数作为另一个类的另一个函数的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60255986/

相关文章:

c++ - 模板函数的实例化点在调用点之后,编译器如何查找和链接它?

c++ - 使用 protobuf 的段错误

c++ - 用 cout 打印出 bool 选项

c++ - 当字符串保存在一个集合中时,c_str() 是否仍然有效

c++ - 初始化列表与初始化方法

c++ - C++0x RValue 引用或其他特性是否会对流性能产生影响?

c++ - 从代码创建的 QPushButton 的最小尺寸/宽度

c++ - std::move(key) 在迭代 unordered_map<string, string> 时?

c++ - C++ 分析工具的建议

c++ - 相同的声明两种不同的类型