2011-11-22 57 views
1

好的,所以我正在寫一個簡單的方案解釋器(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; 
}; 

我試圖把名單中的聯合(這是在類中),但編譯器抱怨。我的問題是這樣的:是否有可能在課堂上列出一個班級名單?我想我應該可以,因爲默認情況下,列表中將沒有對象(所以沒有無限增長)。其次,如果這是不可能的,那麼對於如何實現這一點,是否還有其他建議?我知道我可以實現列表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

+1

爲什麼不使用指針列表呢? –

+0

也許boost :: ptr_list(http://www.boost.org/doc/libs/1_48_0/libs/ptr_container/doc/ptr_list.html)? – Pablo

+0

所有類都包含一個類嗎? –

回答

0

指針列表應該編譯。

list<Object*> l; 
+2

您不能有引用列表。標準庫容器要求對象可複製和分配,引用不可複製。 –

+0

@Als羅傑。 –

+0

但它並沒有,出於某種原因。 – semisight

1

關於你的問題,是的,應該沒有任何問題。現在,你一定想要嗎?依靠。如果例如指針或智能指針列表可能更好。你想共享或轉移列表中對象的所有權,或者如果你想要對象的多態行爲。

這是一個單獨的問題,但我不會使用聯合。他們通常在C++中被忽視。如下所示,繼承是「正確的」OO方式。

至於另一個小問題,可以考慮使用的vector代替list,除非你在列表的中間做插入/缺失的很多。 (Myers的有效STL提倡這一點,但在你的情況下,它可能沒有任何區別)。

+0

我知道'矢量'在大多數問題上更有效率。我在前面使用'list'專門用於它的O(1)插入,這在lisps中很常見。 'vector'甚至沒有push/pop前端方法。 – semisight

+0

@semisight:'deque'具有O(1)正面和背面插入,具有更好的性能屬性,list可以實現。 –

+0

@dimatura:實際上,即使在中間插入,除非您真的擁有大量的項目,否則'vector'可能是更好的選擇(因爲緩存局部性)。最好根據所需的*特性*進行選擇,這些特性在架構或編譯器之外是穩定的。當你希望迭代器穩定時,即使在序列中間存在插入/刪除的情況下,「list」也是最好的選擇。當然,如果你真的有性能問題,通過探查器確定,通過所有的手段切換你的容器類型:) –

0

我建議使用繼承(即有一個抽象Value超與IntegerSymbolList等..子類)。他們可以使用指針(或引用)的STL容器,即std::list<Value*>std::vector<Value*>std::map<Symbol*,Value*>等)。

垃圾收集考慮使用Boehm's GC;但不要忘記GC;它是任何類Lisp實現的重要組成部分,您最好在設計之初就考慮它。回想一下,GC處理程序的全局屬性(實時數據不是模塊化屬性)。

參見this question

+0

我之前見過Boehm的GC,但忘記了它,謝謝你的建議。 至於std :: map建議,那實際上就是我正在做的。我使用'std :: map '作爲我的「堆」內存,其中'Object'是您在上面看到的類。 – semisight

+0

我建議將地圖指向對象的指針,而不是地圖對象! –

+0

啊,對不起。我很累:P – semisight

0

有實際上是另一個解決您的問題:你有沒有考慮分爲二的對象?

可以具有含ObjectCore結構兩者enumunionObject類本身將包含一個直接和ObjectCore一個deque<ObjectCore>爲好。

如果你願意,爲了更好的隔熱效果,你可能希望將ObjectCore定義爲Object類的內部類,它仍然可以工作。

3

擺脫'雙端隊列」沒有指定類型」的錯誤由:

包括頭

#include <deque> 

使用空間std

using namespace std; 

或只是這樣做(而不是使用命名空間)

std::deque<Object*> l; 
+0

我想通了,但你確實是對的,謝謝。 – semisight

相關問題