假设我有:
要实现这一点,请在C ++ I:
中实现下面给出了一个代码示例。
#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'没有类型
答案 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>
。