Sim*_*nAx 5 c++ vector unique-ptr c++11
尽管已经使用C#工作了几年,但在某些时候用C++完成工作仍然很困难.我完全接受智能指针的使用,但现在我面临着以下难题
我有一个结构Foo,例如
struct Foo
{
Foo(std::unique_ptr<Bar> bar) : m_myBar(std::move(bar)) {}
private:
std::unique_ptr<Bar> m_myBar;
};
Run Code Online (Sandbox Code Playgroud)
在另一个类中,我想要一个包含Foo实例的向量,但是以下行
std::vector<Foo> m_Foos;
Run Code Online (Sandbox Code Playgroud)
产生编译错误,表示删除了复制构造函数.在SO线程" 为什么我不能将unique_ptr推入向量? "中给出了解释和补救措施.但是,问题涉及一个唯一指针的向量,而我有一个包含唯一指针的结构向量.建议的解决方案是使用移动语义,但这在我的情况下如何适用?或者我应该做别的事吗?
正如你所说,m_Foos实际上是另一个类的数据成员(我将其称为FooHolder)。如果您没有为 提供复制构造函数FooHolder,编译器将自动生成一个。该复制构造函数将调用 的所有数据成员的复制构造函数FooHolder,包括m_Foos. 当然, 的复制构造函数std::vector<Foo>包含编译错误,因为Foo它是不可复制的。这可能就是您收到错误的原因。
FooHolder如果您能够并且希望该类可复制,则必须为 提供适当的复制构造函数。否则,您可以只声明一个移动构造函数(可能是默认的),这将使复制构造函数被删除:
struct FooHolder
{
FooHolder(FooHolder&&) = default;
private:
std::vector<Foo> m_Foos;
};
Run Code Online (Sandbox Code Playgroud)