好的,所以我正在编写一个简单的方案解释器(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
。
答案 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)
我建议使用继承(即拥有一个带有Value
,Integer
,Symbol
等等的抽象List
超类......子类。他们可以使用指针(或引用)的STL容器,即std::list<Value*>
或std::vector<Value*>
或std::map<Symbol*,Value*>
等。
对于垃圾收集,请考虑使用Boehm's GC;但不要忘记GC;它是任何类似Lisp的实现的重要组成部分,您最好在设计之初考虑它。回想一下,GC处理程序的全局属性(实时数据不是模块化属性)。
答案 5 :(得分:0)
您的问题实际上还有另一种解决方案:您是否考虑将对象拆分为两个?
您可以拥有包含ObjectCore
和enum
的{{1}}结构,以及union
类本身,其中包含一个Object
和ObjectCore
{1}}也是。
如果您愿意,为了更好的隔离,您可能希望将deque<ObjectCore>
定义为ObjectCore
类本身的内部类,它仍然有用。