2016-06-11 29 views
0

一個向量的元素,如果我有一個類:的行爲,當你設置的類別等於類

Class aClass 
{ 
    vector<aClass> connections; 
} 

與一切正確聲明,如果我做的:

aClass a = new aClass(); 
aClass b = new aClass(); 

b.connections.push_back(a); 

這是否會創建對a的引用或者是否會重複該類?

我希望它是一個指向類的指針,但我不確定是否需要額外的語法來確保這一點。我記得讀到當一個類聲明爲aClass a = new aClass時,它創建了一個指向堆中對象的指針,但我不確定這裏會發生什麼。

供參考,這是爲了像一個鏈接列表。

此外,如果任何人都可以爲這個問題想出一個更好的標題,請繼續編輯它。

回答

2
  1. connections應該是vector<aClass*>aClass a應該aClass* a

  2. 然後,對於b.connections.push_back(a);,指針的值將被複制,而不是指向對象(即被指向的對象)。

  3. 如果你想使用指針,比如std::vector<std::shared_ptr<aClass>>,我會建議你使用smart pointers而不是原始指針。

+0

謝謝,我幾年沒有做很多C++編程,所以我不記得這裏會發生什麼。 – Cjen1

+0

作爲一個關於指針的問題,如果一個程序被關閉,並且仍然有引用對象的指針,這些對象是否會被刪除並被垃圾收集?或者它們會導致內存泄漏 – Cjen1

+0

@ Cjen1如果使用原始指針,'new'但不'刪除'它,則會導致內存泄漏。這就是爲什麼我建議聰明的指針。 – songyuanyao

0

首先,vector<aClass>不是類的向量,它是類的實例的向量。

二,aClass a = new aClass();很難用C++編譯。在大多數情況下,類的默認構造實例被創建爲aClass a;,並且new aClass()通常返回指針到該類的新實例。

三,即使你向push_back一個實例向量,它也被複制。

對於默認構造的對象,可以由1

resize荷蘭國際集團的載體構建物在所述載體的端部的新鮮對象2011年以來,就可以構造通過非默認的構造實例(與非 - 使用emplace_back直接在矢量內的一組構造參數)。

0

如果代碼被製成編譯的,我認爲那你打算什麼:

documentation說,這是有2個重載

void push_back(const T& value); 
void push_back(T&& value); 

所以只要你不明確std::move或者輸入一個函數返回值或者返回值,那麼第一個超載將觸發,這意味着將調用複製push_back。否則,第二個移動將被調用。

編輯:型鑄造和std::move是同樣的事情。但是,它保留了常量的正確性,因此如果您要通過const T,那麼std :: move將使其爲const T&&,這在重載分辨率中非常危險。

你不應該通過const T&&有關爲什麼要讀here

0
aClass a = new aClass(); 
aClass b = new aClass(); 

b.connections.push_back(a); 

它甚至不會編譯。正如有人提到你應該寫aClass *aaClass *b

aClass a; 
    aClass b; 

    b.connections.push_back(a); 

這將值複製到向量,因爲你的矢量持有ACLASS對象(值,而不是地址)。它不會複製任何地址。但是,如果你做了這樣的事情:

vector<aClass*> connections; 
aClass *a = new aClass(); 
aClass *b = new aClass(); 
b.connections.push_back(a); 

然後載體將舉行一個指針ACLASS對象(ACLASS的實例)。所以在這種情況下,連接[0]將指向a對象。如果你這樣做::

cout << connections[0]<< endl; 
cout << a << endl; 

然後這些行是相等的。他們將打印相同的東西(相同的地址)。

最後,如果你刪除a對象:

delete a; 

然後,它會指向那個地方在內存中的對象被放置在,但沒有a對象了。所以,你不能這樣做:

cout << a << endl; 

但你仍然可以做:

cout << connections[0] << endl; 

它將打印相同的地址之前。