0

假设我有:

  • 两个等级: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”的字段</p>

预期的 ';' 在'<'之前 令牌

'::' 的无效使用</p>

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

4

2 回答 2

3

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

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

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_;
};
于 2013-02-21T23:43:13.550 回答
0

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

如果您绝对想使用 shared_ptr,请包含 header <boost/smart_ptr/shared_ptr.hpp>

于 2013-02-21T23:45:05.187 回答