我需要使用另一个类的唯一\u ptr实现回调方法:
#include <iostream> #include <functional> #include <memory> #include <vector> class A { public: void Show(std::vector<int> a, int b) {std::cout << "Hello " << " " << b << std::endl;} }; class B { public: void SetCB(std::function<void(std::vector<int> ,int)> callb); std::function<void(std::vector<int> ,int)> cb; }; void B::SetCB(std::function<void(std::vector<int> ,int)> callb) { cb= callb; } int main() { std::unique_ptr<A> a1 = std::make_unique<A>(); std::unique_ptr<B> b1 = std::make_unique<B>(); b1->SetCB([&](std::vector<int> a, int b){a1->Show(a,b);}); std::vector<int> y; b1->cb(y,4); }
我在VC++中遇到了运行时读取访问错误冲突-我们如何使用unique_ptr实现回调,并使用std::bind或其他方式使用一些参数?
$ c++ -std=c++14 try68.cpp ^
无法使用unique_ptr设置回调方法吗?
一句忠告,您应该非常小心地使用捕获 引用局部变量 . 如果您的回调是从 a1 变量(这是main()函数,因此您的示例是正确的),然后是表达式 a1->Show(a,b) a1 是一个 悬挂参考 a1 通过移动:
a1
a1->Show(a,b)
b1->SetCB([ptr=std::move(a1)](std::vector<int> a, int b){ptr->Show(a,b);};
然后您的回调函数将获得该对象的所有权 a1 指向。