C++ 成员对象作为唯一的\u ptr或在堆栈上

C++ 成员对象作为唯一的\u ptr或在堆栈上,c++,member,unique-ptr,C++,Member,Unique Ptr,目前我正在考虑将一些成员对象存储在unique_ptr中。 通常我只在一些函数中使用unique_ptr,并将其四处移动,或传递对它的引用。 那我在课堂上该怎么做呢 Class MyClass { std::unique_ptr<MyMemberClass> member; } 对象的生存期是相同的。构造函数中的初始化几乎相同。 唯一的区别是,我不能复制唯一的\u ptr,或者 还有其他区别吗? 我应该使用或更喜欢哪个?区别: 1) 不能使用unique\u ptr复制类(

目前我正在考虑将一些成员对象存储在unique_ptr中。 通常我只在一些函数中使用unique_ptr,并将其四处移动,或传递对它的引用。 那我在课堂上该怎么做呢

Class MyClass {
    std::unique_ptr<MyMemberClass> member;
}
对象的生存期是相同的。构造函数中的初始化几乎相同。 唯一的区别是,我不能复制唯一的\u ptr,或者

还有其他区别吗? 我应该使用或更喜欢哪个?

区别:

1) 不能使用
unique\u ptr
复制类(实际上可以,但这没有意义),但可以移动

2) 如果
member
unique\u ptr
MyMemberClass
对象应该在堆上分配,而在第二种情况下,它是在堆栈上分配的(当
MyClass
类型的对象在堆栈上分配时)

3) 若
member
是一个复杂的对象,那个么将指针存储在上面可能会更好,在其他情况下,只需对象就可以了

4) 如果
成员
唯一的\u ptr
它可以是多态对象。它允许创建聚合对象。第二种形式是不可能的(多亏了chmike)

还有其他区别吗?我应该使用或更喜欢哪一种

这里的决定因素是:

  • 多态行为:如果存储类层次结构的公共接口,则应按指针、智能指针或引用进行存储

  • 生存期:如您所述,如果保留对象的生存期长于
    MyClass
    (显然,它不属于
    MyClass
    ),则应将其保留在原始指针或std::shared\ptr中

  • 所有权:如果对象不属于
    MyClass
    ,则应将其存储为指针(智能或非智能)或引用

  • api约束:如果保留的对象是由只能动态分配它的库生成的(例如),那么您可能希望将其保留在指针(或唯一的\u ptr)中


当对象被
MyClass
所拥有(独占)时,它与所拥有的类具有相同的生存期,并且您没有多态行为,您可能应该直接存储实例。

第二个不存储
member
“在堆栈上”,它存储在
MyClass
对象存储的任何位置,这可能是堆栈,但也可能是其他任何地方。为什么“class”关键字以大写字母开头?@PaoloM:the
class
关键字不以大写字母开头。但是,OP的代码包含以大写字母开头的单词
Class
member
是pimpl和依赖项注入的常用习惯用法,即调用方提供对象的精确内容的情况。此外,使用Unique_ptr,
member
可以是多态对象。它允许创建聚合对象。对于第二种形式,它是不可能的。@chmike 3)如果成员是复杂的对象,那么在它上面存储指针可能比在它上面存储指针要好,在其他情况下,只存储对象就可以了。你能解释为什么吗?我想说,如果你修改成员对象的复杂类,它是为了最小化要重新编译的代码。类的复杂性增加了以后更改的可能性。
Class MyClass {
    MyMemberClass member;
}