尽管已经使用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线程“为什么不能将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;
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句