这是在C ++中将一个类对象包含在另一个类中的最佳方法

时间:2014-01-08 11:27:37

标签: c++ stl

假设一个A类对象应该是B类的一部分,那么我有三种方法将它合并到B类内部:

Method 1:
    class B
    {
     public:
          B():objA() {};
          ~B() {};
          A objA;    
    };


Method 2:  
    class B
    {
     public:
          B():pobjA(0) {};
          ~B() { delete pobjA;}
          A *pobjA;    
    };
Method 3:
    class C
    {
     public:
           B() {};
           ~B() {};
           boost::shared_ptr<A> pObjA;
    };

然后我的问题是:当我将对象A作为B类的一部分时,我可以遵循一些指导。谢谢。

4 个答案:

答案 0 :(得分:1)

如果没有理由使用指针,请不要使用指针:我会选择第一个选项。另请注意,第二个示例中的RAII完全被破坏,因为它不遵循三个规则。

如果您需要动态分配,可以使用第三个boost::shared_ptrstd::shared_ptr

答案 1 :(得分:1)

如果您希望在创建A时对该对象进行动态分配,那么在您需要时,请选择动态 new 。在这种情况下,请记住,当A被销毁时,用删除你的对象来收集它们,否则你会泄漏内存。

使用boost :: shared_ptr处理垃圾收集,这样只要你控制收集指针的范围就可以跳过“删除”阶段(nb。你的代码在第二步中被窃听,你需要分配在以某种方式解除分配对象之前)

第一种方法总是在父对象的内存布局中分配一个对象,并在对象被销毁时释放它。请注意,如果您有无参数的默认构造函数(或默认构造函数),则不需要在初始化列表中进行默认构造函数调用

答案 2 :(得分:1)

我相信您正在寻找association, aggregation, and composition之间的区别,以及何时适合使用它们。除了使用你可以逃脱的最弱关系之外,没有通用的答案。至于使用智能指针,你可能会在任何地方使用它们,否则你会使用原始指针,但想要更干净地管理所有权。这就是开销,专业是整洁。

答案 3 :(得分:1)

只是对其他人的一小部分: 如果您关心编译速度 - 请使用pimpl idiom。 在你的情况下,它应该是方法3(我更喜欢unique_ptr)。