目前我正在考虑在unique_ptr中存储一些成员对象。 通常我只在某些函数中使用unique_ptr并移动它,或者传递对它的引用。 那我该怎么做课呢?
Class MyClass {
std::unique_ptr<MyMemberClass> member;
}
或:
Class MyClass {
MyMemberClass member;
}
对象的生命周期是相同的。构造函数中的初始化几乎相同。 唯一的区别是,我无法复制unique_ptr,或者?
还有其他差异吗? 我应该使用或更喜欢哪个?
答案 0 :(得分:2)
还有其他差异吗?我应该使用或更喜欢哪个?
是
这里的决定因素是:
多态行为:如果存储类层次结构的公共接口,则应按指针,智能指针或引用进行存储。
生命周期:正如您所提到的,如果保留的对象的生命周期比MyClass
更长(显然,它不属于MyClass
),那么它应该保存在原始指针或std :: shared_ptr。
所有权:如果对象不属于MyClass
,则应将其存储为指针(智能或非智能)或参考。
api约束:如果保持的对象是由只能动态分配它的库生成的(例如),那么你可能希望将它保存在指针中(或者unique_ptr) )。
当对象由MyClass
拥有(排他性)时,它与拥有类具有相同的生命周期,并且您没有多态行为,您应该直接存储该实例。
答案 1 :(得分:0)
的差异:
1)你不能用unique_ptr
复制课程(实际上你可以,但这没有任何意义),但你可以移动。
2)如果member
为unique_ptr
,则应在堆上分配MyMemberClass
对象,而在第二种情况下,它在堆栈上分配(当对象类型为{{1}时在堆栈上分配。)
3)如果MyClass
是复杂的对象,那么可能存储指针就好了,在其他情况下只是对象就好了。
4)如果member
为member
,则它可以是多态对象。它允许创建聚合对象。使用第二种形式是不可能的(感谢chmike)。