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,请包含标题 <boost/smart_ptr/shared_ptr.hpp>
。
【讨论】:
以上是关于boost::shared_ptr - 两个类之间的组合关系的主要内容,如果未能解决你的问题,请参考以下文章
通过取消引用 boost::shared_ptr 找不到派生类的方法