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

时间:2013-02-21 23:33:06

标签: c++ boost shared-ptr

假设我有:

  • 两个类:P和C.
  • P> - C之间的组成关系,即P的每个实例都包含C的实例,当父P实例被销毁时它被销毁。

要实现这一点,请在C ++ I:

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

下面给出了一个代码示例。

    #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'的字段

     

预期';'在'&lt;'标记

之前      

无效使用'::'

     

ISO C ++禁止声明'shared_ptr'没有类型

2 个答案:

答案 0 :(得分:3)

错误的最可能原因是您包含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_;
};

答案 1 :(得分:0)

正如KerrekSB在评论中暗示的那样,您使用了shared_ptr,但包括scoped_ptr。不同之处在于scoped_ptr表示独占所有权(这种情况就是这种情况),而shared_ptr表示共享所有权(事实并非如此)。首选的习惯用法是在代码中使用scoped_ptr

如果您绝对想使用shared_ptr,请添加标题<boost/smart_ptr/shared_ptr.hpp>