2011-11-20 46 views
12

擁有對象引用的向量是否合法?對象引用的向量

vector<Agent&> seenAgents; 

哪個例子可以由場景中的一些對象而不是所有對象填充?

我有代理對象的載體,但上述載體應堅持只有那些每個代理目前可以看到的引用 - 這意味着將要添加的引用並刪除所有的時間。

這是語言允許的東西嗎?此外,還有什麼我需要注意的?如果我從矢量中刪除引用,它會在任何地方持續嗎?這是內存泄漏嗎?

我似乎就行宣佈矢量已經意識到了這個錯誤:

error C2528: 'pointer' : pointer to reference is illegal 

這是不是直接做線路或最有可能發生在其他地方?它被初始化在構造函數初始化器列表如下:

seenAgents(vector<Agents&>()) 
+0

重複的http://stackoverflow.com/questions/922360/why-cant-i-make-a-vector-of-references –

回答

19

你不能引用vector,作爲參考並不 可複製 分配和所有 STL容器都應該存儲 可複製 分配項目。

但是你可以讓容器容納指針。像這樣:

vector< Agents* > seenAgents; 

這有點危險。您需要確定這些指針將保持有效。我的意思是 - 如果某人刪除了一個對象,並由該容器中的指針指向,則指針將變爲無效。您需要確保這不會發生,因爲您無法檢查它(您無法檢查NULL,因爲如果某人刪除了尖銳的對象,指針將不會變爲NULL)。

這裏最好的解決方案(由帶有指針的容器提供)將使用一些智能指針 - 例如一些引用計數;他們會保證你的對象將存在,並且指針是有效的。如果智能指針指向的對象被破壞,您可以檢查它是否爲NULL

+2

你確定引用不可複製嗎?我會認爲他們是不可轉讓的。 – UncleBens

+0

對,謝謝。但是你仍然不能「複製」一個引用,因爲它不是一個真正的類型,它不是真的存在,我的意思是 - 沒有爲它分配momory(在大多數編譯器實現中,很確定 - 所有這些)。但仍然 - 是的,'assignable'聽起來更正確,更不容易混淆。編輯:) –

+0

你也不能默認構建它們。 –

8

你不能這樣做。使用指針。

Boost庫提供PTR_VECTOR比一個更好的解決方案:

vector<T*> foo; 
+2

爲什麼'ptr_vector'更好,然後'矢量'。當你說有些東西比較好時,其他東西就會描述你的指標。 – tomas789

+1

「ptr_vector」更好的原因有很多,你可以在這裏閱讀(http://www.boost.org/doc/libs/1_55_0/libs/ptr_container/doc/examples.html)。但是,簡而言之,它們更像是一個引用向量,因此通常更安全。例如,您不要自己對指針進行取消引用,也不能在向量中存儲「NULL」指針。 – edam

+1

Ooops,我的意思是說「你不能在向量中存儲'NULL'指針* *默認*! – edam

2

我想類似的功能。最後,這裏是我所做的:

template <class T> class VectorOfRefs : public std::vector<T *> { 
public: 
    inline T & at(const uint64_t i) { 
     T * x = std::vector<T *>::at(i); 
     return *x; 
    } 
}; 

VectorOfRefs <MyType> myVector; 
myVector.push_back(&myInstance0); 
myVector.push_back(&myInstance1); 

// later in the code: 
myVector.at(i).myMethod(); 

很明顯,這是一個向下的指針的封面。

通常我會用STL和定居myVector.at(i)->myMethod(),但我想用++運算符,所以我有以下兩種選擇:

// using STL: 
(*myVector.at(i))++; 

// or, using my wrapper: 
myVector.at(i)++; 

我發現包裝遠遠優於而言符號的代碼可讀性。我本人並不喜歡這個包裝,但它稍後會派發股息。