【问题标题】:Which is the best way of including one class object insider another class in C++这是在 C++ 中将一个类对象包含在另一个类中的最佳方法
【发布时间】:2014-01-26 11:25:11
【问题描述】:

假设 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 类的一部分时,我可以遵循一些指导方针吗?谢谢。

【问题讨论】:

  • 在另一个类中包含一个类对象的唯一方法是方法 1。其他方法做的事情完全不同。
  • 在每个类声明之后不要忘记你的;
  • 另外,在您尝试 delete 之前,您不需要检查 pobjA 的“非空性”:delete NULL 是标准规定的良性

标签: c++ stl


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果您希望在创建 A 时动态分配对象,则在您认为有必要时选择动态 new。在这种情况下,请记住在 A 被销毁时使用 delete 进行垃圾收集,否则您将泄漏内存。

    使用 boost::shared_ptr 负责垃圾收集,因此只要您控制收集指针的范围,您就可以跳过“删除”阶段(nb。您的代码在第二步中出现错误,您需要分配在以某种方式释放对象之前)

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

    【讨论】:

      【解决方案3】:

      我相信您正在寻找association, aggregation, and composition 之间的区别,以及何时适合使用它们。除了使用可以摆脱的最弱关系之外,没有通用的答案。就使用智能指针而言,您可能会在使用原始指针但希望更干净地管理所有权的任何地方使用它们。缺点是开销,优点是整洁。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-03
          • 2019-07-29
          • 2013-06-05
          • 1970-01-01
          • 2017-01-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多