尽管已经使用C#工作了几年,但在某些时候用C ++完成工作对我来说仍然很困难。我完全接受智能指针的使用,但现在我面临着以下难题
我有一个结构Foo
,例如
struct Foo
{
Foo(std::unique_ptr<Bar> bar) : m_myBar(std::move(bar)) {}
private:
std::unique_ptr<Bar> m_myBar;
};
在另一个类中,我希望有一个包含Foo实例的向量,但是以下行
std::vector<Foo> m_Foos;
产生编译错误,表示删除了复制构造函数。在SO线程“Why can I not push_back a unique_ptr into a vector?”中给出了解释和补救措施。但是,问题涉及一个唯一指针的向量,而我有一个包含唯一指针的结构向量。建议的解决方案是使用移动语义,但这在我的情况下如何适用?或者我应该做些什么?
答案 0 :(得分:4)
正如你所说,m_Foos
实际上是另一个类的数据成员(我称之为FooHolder
)。如果您没有为FooHolder
提供复制构造函数,编译器将自动生成一个。该拷贝构造函数将调用FooHolder
的所有数据成员的拷贝构造函数,包括m_Foos
。当然,std::vector<Foo>
的复制构造函数包含编译错误,因为Foo
不可复制。这可能是您收到错误的原因。
如果您能够并且希望该类可以复制,那么您必须为FooHolder
提供适当的复制构造函数。否则,您可以声明一个移动构造函数(可能是默认的),这将使复制构造函数被删除:
struct FooHolder
{
FooHolder(FooHolder&&) = default;
private:
std::vector<Foo> m_Foos;
};
答案 1 :(得分:1)
您无法复制唯一指针。您只能移动:
Foo(std::unique_ptr<Bar> bar) : m_myBar(std::move(bar)) {}
// ^^^^^^^^^^^^^^