boost::shared_ptr - 两个类之间的组合关系

Posted

技术标签:

【中文标题】boost::shared_ptr - 两个类之间的组合关系【英文标题】:boost::shared_ptr - composition relation between two classes 【发布时间】:2013-02-21 23:33:06 【问题描述】:

假设我有:

两个等级:P 和 C。 P-C之间的组成关系,即P的每个实例都包含一个C的实例,当父P实例被销毁时,C的实例也被销毁。

为了实现这一点,在 C++ I 中:

定义两个类 P 和 C; 定义一个 boost::shared_ptr 类型的 P 成员变量,并在 P 的构造函数中使用新创建的对象对其进行初始化。

下面给出一个代码示例。

    #include "boost/scoped_ptr.hpp"

    class C
    
      public:
        C() 

      private:

    ;

    class P
    
      public:
        P() : childC(new C()) 

      private:
        boost::shared_ptr<C> childC;
    ;

    int main(int argc, char** argv)
    
        P p;
    

不知何故,我无法构建这个简单的代码示例,而且我不明白为什么(我是编程新手)。

错误:

类‘P’没有任何名为‘childC’的字段

在“

‘::’的使用无效

ISO C++ 禁止声明没有类型的“shared_ptr”

【问题讨论】:

如果你想要shared_ptr,那么你需要#include "boost/shared_ptr.hpp"。但是为什么需要共享呢? “范围”、“共享”、... 又一个新颖而紧张的“父母/孩子”隐喻应用。 谢谢大家,我犯了一个严重的错误。 @juanchopanza:我想使用 boost::shared_ptr 来尽量减少产生内存泄漏的机会(所以我不必显式销毁所有子对象)。 【参考方案1】:

您的错误最可能的原因是您包含boost/scoped_ptr.hpp 并且您试图声明boost::shared_ptr。您不太可能在这里需要boost::shared_ptr

在这种情况下,表达composition 的最简单方法是

class C ;
class P 

 private:
  C c_;
;

现在您可能希望通过使用只需要前向声明 C 的习惯用法来减少编译时间依赖性,在这种情况下,P 的标头可能是

#include <boost/scoped_ptr.hpp>

class C; // forward declaration

class P

 public:
  P() : c_(new C()) 
 private:
  boost::scoped_ptr<C> c_;
;

【讨论】:

【参考方案2】:

正如 KerrekSB 在 cmets 中所暗示的,您使用了 shared_ptr,但包括了 scoped_ptr。区别在于scoped_ptr 表示独占所有权(这里是这种情况),而shared_ptr 表示共享所有权(不是这种情况)。首选的习惯用法是在代码中使用scoped_ptr

如果您绝对想使用 shared_ptr,请包含标题 &lt;boost/smart_ptr/shared_ptr.hpp&gt;

【讨论】:

以上是关于boost::shared_ptr - 两个类之间的组合关系的主要内容,如果未能解决你的问题,请参考以下文章

通过取消引用 boost::shared_ptr 找不到派生类的方法

boost shared_ptr 初始化为类成员

boost::shared_ptr

返回 boost::shared_ptr 和从返回的原始指针构造 boost::shared_ptr 有啥区别?

boost库之内存管理shared_ptr

Boost智能指针——shared_ptr