一个类可以包含自己的列表吗?

时间:2011-11-22 06:09:23

标签: c++ c++11

好的,所以我正在编写一个简单的方案解释器(ala Bootstrap Scheme),但在C ++ 11中(这个问题并不是特定于C ++ 11)。我正试图为我的班级“对象”提出一个合理的形式。目前,我的布局类似于:

typedef union {
  int i;
  double d;
  char c;
} value;

class Object {
public:
  //Constructors and stuffs...

private:
  obj_type type;
  value val;
  list<Object> l;
};

我尝试将列表放在union中(在类中),但编译器抱怨。我的问题是:是否可以在课堂上放置一个班级列表?我认为我应该可以,因为默认情况下列表中没有对象(所以没有无限增长)。

其次,如果这是不可能的,还有其他建议如何实现这个?我知道我可以实现列表C风格(带指针),但STL列表使事情变得简单得多。

更新:好的,所以指针似乎是一个很好的解决方案。我不想使用Boost,因为那是一个我还没有广泛使用的库,我这样做的部分原因是为了更好地掌握STL。

更新2:新代码如下所示:

class Object {
//...
private:
  obj_type type;
  int i;
  double d;
  char c;
  deque<Object*> l;
};

但我仍然遇到编译器错误:‘deque’ does not name a type

6 个答案:

答案 0 :(得分:2)

另一种选择......

自Boost 1.48起,Container library提供了containers of incomplete types。准确地说明你要完成的任务。

答案 1 :(得分:2)

摆脱''deque'没有命名类型“错误:

包含标题

#include <deque>

使用std名称空间

using namespace std;

或者只是这样做(而不是使用命名空间)

std::deque<Object*> l;

答案 2 :(得分:1)

关于你的问题,是的,应该没有任何问题。现在,你一定想要吗?要看。如果例如指针或智能指针列表可能更好。您希望共享或转移列表中对象的所有权,或者您希望对象具有多态行为。

这是一个单独的问题,但我不会使用联盟。他们通常不满意C ++。如下所示,继承是“正确的”OO方式。

作为另一个小问题,请考虑使用vector而不是list,除非您在列表中间执行 lot 插入/删除操作。 (迈尔斯的有效STL主张这一点。但在你的情况下,它可能没有任何区别)。

答案 3 :(得分:0)

指针列表应该编译。

list<Object*> l;

答案 4 :(得分:0)

我建议使用继承(即拥有一个带有ValueIntegerSymbol等等的抽象List超类......子类。他们可以使用指针(或引用)的STL容器,即std::list<Value*>std::vector<Value*>std::map<Symbol*,Value*>等。

对于垃圾收集,请考虑使用Boehm's GC;但不要忘记GC;它是任何类似Lisp的实现的重要组成部分,您最好在设计之初考虑它。回想一下,GC处理程序的全局属性(实时数据不是模块化属性)。

另见this question

答案 5 :(得分:0)

您的问题实际上还有另一种解决方案:您是否考虑将对象拆分为两个?

您可以拥有包含ObjectCoreenum的{​​{1}}结构,以及union类本身,其中包含一个ObjectObjectCore {1}}也是。

如果您愿意,为了更好的隔离,您可能希望将deque<ObjectCore>定义为ObjectCore类本身的内部类,它仍然有用。