假设一个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类的一部分时,我可以遵循一些指导。谢谢。
答案 0 :(得分:1)
如果没有理由使用指针,请不要使用指针:我会选择第一个选项。另请注意,第二个示例中的RAII完全被破坏,因为它不遵循三个规则。
如果您需要动态分配,可以使用第三个boost::shared_ptr
或std::shared_ptr
。
答案 1 :(得分:1)
如果您希望在创建A时对该对象进行动态分配,那么在您需要时,请选择动态 new 。在这种情况下,请记住,当A被销毁时,用删除你的对象来收集它们,否则你会泄漏内存。
使用boost :: shared_ptr处理垃圾收集,这样只要你控制收集指针的范围就可以跳过“删除”阶段(nb。你的代码在第二步中被窃听,你需要分配在以某种方式解除分配对象之前)
第一种方法总是在父对象的内存布局中分配一个对象,并在对象被销毁时释放它。请注意,如果您有无参数的默认构造函数(或默认构造函数),则不需要在初始化列表中进行默认构造函数调用
答案 2 :(得分:1)
我相信您正在寻找association, aggregation, and composition之间的区别,以及何时适合使用它们。除了使用你可以逃脱的最弱关系之外,没有通用的答案。至于使用智能指针,你可能会在任何地方使用它们,否则你会使用原始指针,但想要更干净地管理所有权。这就是开销,专业是整洁。
答案 3 :(得分:1)
只是对其他人的一小部分: 如果您关心编译速度 - 请使用pimpl idiom。 在你的情况下,它应该是方法3(我更喜欢unique_ptr)。