2013-12-08 139 views
0

我有一個類有vector<CCPoint>類型的成員。我想在構造函數調用中初始化這個成員,怎麼實現呢?在構造函數C++中初始化成員向量

我做了這樣的:

.H

class A{ 
    public: 
     A(vector<CCPoint> *p); 
    private: 
     vector<CCPoint> *p; 
} 

的.cpp

A:A(){ 
    this->p = p; 
} 

呼叫

Vector<CCPoint> *p = new Vector<CCPoint>; 
A a = new A(p); 
+0

那麼什麼(除了明顯的拼寫錯誤)是錯誤的呢?如果有什麼特定的東西你不喜歡這種方法,你需要告訴我們。 –

+0

該死,我得到了空指針異常,但現在我看到我在初始化它之前使用了該向量。如果你不睡幾天就會發生這種情況。說實話,我還沒有使用過C++,所以我使用了這個規則:「在每個非原始變量之前添加一個*,它將像Java一樣工作」,至少就我所見過的而言。我知道這是無禮的...謝謝你的回答總之 –

+1

_「在每個非原始變量之前加一個*,它將像Java一樣工作」_是一個可怕的規則。它不會像Java一樣工作,因爲C++沒有本地垃圾回收器。 – Chad

回答

4

這會泄漏內存,因爲沒有人刪除你「新」的矢量。

此外,爲什麼有一個指向矢量的指針呢?你是否擔心將它複製到構造函數中很昂貴?

更改成員是一個向量:

class A{ 
    public: 
     A(vector<CCPoint> p); 
    private: 
     vector<CCPoint> p; 
} 

更改使用初始化器列表構造函數:

A:A(vector<CCPoint> newP) : p(newP){ 
    // Empty 
} 

,要求把這樣的:永遠不要

Vector<CCPoint> p; 
A a(p); 

,永遠用「新」創建一個對象,除非你確切知道你爲什麼這樣做,即使這樣,重新考慮。

性能注意:是的,這個可能會導致一個向量複製發生,這取決於編譯器的複製精度。一個替代的C++ 11花式褲子解決方案將使用移動:

class A{ 
    public: 
     A(vector<CCPoint> p); 
    private: 
     vector<CCPoint> p; 
} 

A:A(vector<CCPoint> newP) : p(std::move(newP)){ 
    // Empty 
} 

Vector<CCPoint> p; 
A a(std::move(p)); // After this completes, 'p' will no longer be valid. 
+0

爲什麼要有人刪除它,如果我以後需要它?當我不再使用A類時,GC將刪除它,不是嗎? –

+1

沒有GC。 – polkadotcadaver

0

有一個錯誤在你的CPP文件,你」再次錯過第二個結腸:

A::A() { 

此外,您還可以使用像這樣的初始化列表直接初始化p

A::A(vector<CCPoint>* _p) : 
p(_p) 
{} 

不是說有任何真正的優勢在使用此爲基本類型,如指針,但它的好習慣。這回答了你的問題了嗎?根據你的帖子,我不清楚問題是什麼。

相關問題