围绕shared_ptr构建对象系统

时间:2011-04-30 20:05:28

标签: c++ inheritance language-design shared-ptr

我正在使用shared_ptr作为我正在处理的玩具语言的垃圾收集,它编译为C ++。我的对象派生自上面的公共基类,有字符串和数字,然后有矢量和地图。 c ++方面的所有内容都包含在shared_ptr中,因此我的容器实际上保存shared_ptr,这样当它们被破坏时,它们的内容也会被破坏。这个方案有效,但是作为基础对象的容器持有shared_ptr s感觉有点奇怪。我的设计有缺陷吗?如果是,那么围绕这种方法的替代层次结构是什么?

1 个答案:

答案 0 :(得分:1)

以下是我设置的方法:

namespace toylang {

class Object;
// main handle type; use this for all object references
// replace with boost::intrusive_ptr or similar if too inefficient
typedef std::shared_ptr<Object> obj;

class Object
{
    // whatever
};

class Number : public Object
{
    int x;
    // etc
};

class Array : public Object
{
    std::vector<obj> a;
    // etc
}

请注意,此方案中的ToyLang数组是指针的向量,给出了语言引用语义。事实上,这在动态语言中很常见:Lisp,Python和其他类似的工作。只要您没有循环引用,shared_ptr的引用计数将为您提供适当的垃圾回收。