问题描述
我们有2
类A
和B
。B
具有以下构造函数:
B(std::function<std::unique_ptr<A>()> a)
我正在尝试创建一个unique_ptr
,就像在std::unique_ptr<B> aPtr = std::unique_ptr<B>(new B(std::function<std::unique_ptr<A>()));
中一样。我不知道怎么做。它不是编译的,我也无法真正解释错误。
如何为类B
创建unique_ptr?
// Online C++ compiler to run C++ program online
#include <iostream>
#include <memory>
#include <functional>
class A {
public:
A(){}
};
class B
{
public:
B(std::function<std::unique_ptr<A>()> a):_a(std::move(a)) {}
private:
std::function<std::unique_ptr<A>()> _a;
};
int main() {
//std::unique_ptr<B> bPtr = std::unique_ptr<B>(new B(std::function<std::unique_ptr<A>()));
return 0;
}
auto bPtr = std::unique_ptr<B>(new B( std::function< std::unique_ptr<A>() > () ));
// need to close the template ^
// need to construct an instance of ^^
使用std::make_unique
:可以使相同的操作简单一点
auto bPtr = std::make_unique<B>( std::function< std::unique_ptr<A>() >() );
// still as above ^^^
编辑:调整为新问题版本:
您还没有提供复制构造函数,因此需要存储lambda,而不是创建B
实例:
auto l = []() { return std::make_unique<A>(); };
auto bPtr = std::unique_ptr<B>(new B(l));
// or:
auto ptr = std::make_unique<B>(l);
请注意,这个经过编辑的新版本为std::function
对象(lambda!(提供了一个工厂函数,而初始变体构建了一个空的函数,内部没有存储函数,因此不可调用!
您可以通过传递std::function
(或可能转换为的值(来构造B。
例如适当的lambda:
B b{[]() { return std::make_unique<A>(); }};
如果你真的想要std::unique_ptr<B>
,那么它就变成了:
std::unique_ptr<B> b = std::make_unique<B>([]() { return std::make_unique<A>(); });