2010-08-09 103 views
5
//Using g++ and ubuntu. 
#include <vector> 
using namespace std; 

定義一個類:C++有構造函數的類向量

class foo(){ 
(...) 
foo(int arg1, double arg2); 
} 

構造:

foo::foo(int arg1, double arg2){ 
(...) //arrays whose length depend upon arg1 and arg2 
} 

我願做這樣的事情:

vector<foo> bar(10); //error: no matching function for call to 'foo::foo()' 
bar[0] = new foo(123, 4.56); 
(...) 

替代方法(我喜歡更少)是使用push_back:

vector<foo> bar; //works 
bar.push_back(new foo(123, 4.56)); //throws similar error. 
//Omitting the "new" compiles but throws a "double free or corruption (fasttop)" on runtime. 

我想要構造不同的向量的不同元素,所以我不想使用「重複序列構造函數」。 應該做什麼?

回答

4

爲什麼在不需要創建動態內存時使用new?當然,使用new將會失敗,當push_back接受foo時,會導致foo*。 (這就是你的一個載體,畢竟。)

這有什麼錯push_back?如果您想預先保留內存,請使用reserve();在vector的構造函數中提供一個數字使第二個參數(隱含地爲foo(),這將不起作用,因此您的錯誤)的許多副本,這不同於簡單地保留內存。

如果正確處理(沒有new)崩潰,故障在您的代碼中,而不是向量。你可能還沒有寫,管理資源的適當類。*(記住The Big Three,使用copy-and-swap idiom

*我這樣說是因爲你說「//arrays whose length depend upon arg1 and arg2 」,我懷疑意味着你在你們班有new[]某處。沒有三巨頭,你的資源管理就會失敗。

反正你不應該管理資源,班級有一個責任。這意味着它應該是一個動態數組,或者使用一個動態數組,但不能同時管理和使用一個動態數組。所以把這些資源分解到他們自己的班級中,然後製作另一個使用它們的班級(你的)。動態數組是std::vector,所以你已經完成了。 任何時間你需要一個動態數組,使用vector;沒有理由不這樣做。

+0

+1的一個很好的答案。如果可以的話,我想給出額外的+1,因爲不是說你應該總是使用std :: vector,但是你應該總是使用vector。 – Simon 2010-08-09 06:23:57

0

的std ::向量總是創建基於默認的構造函數,你有沒有在片段定義上述元素。

由於您沒有處理複製構造函數,push_back方法面臨着雙重問題。

4
vector<foo> bar(10); //error: no matching function for call to 'foo::foo()' 

這是失敗,因爲std::vector構造你打電話是

explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 

正如你所看到的,它試圖用10所調用的foo默認構造函數不填充矢量存在。

此外,以new爲特徵的所有示例都將失敗,因爲該向量預期的對象類型爲foo而不是foo *。此外,更改爲vector<foo *>也會失敗,除非您在清除向量之前手動將每個成員delete。如果你真的想去動態內存分配路線創建一個vector< shared_ptr<foo> >shared_ptr可用於Boost libraries,或者如果您的編譯器包含TR1庫,它將出現在std::tr1名稱空間內的<memory>標頭中,或者如果您的編譯器具有C++ 0x庫,它將在std名稱空間本身中可用。

什麼,你可能應該做的是以下幾點:

vector<foo> bar; 
bar.reserve(10); 
bar.push_back(foo(1, 2)); 
... 
... 
bar.push_back(foo(10, 20)); //10 times 
+0

可能應該提及的是,shared_ptr是boost庫或C++的一部分0x – 2010-08-09 02:52:20

+0

這是行不通的,但我需要有大3. – 2010-08-09 03:05:39

+0

@Kevin:我懷疑你應該使用'std :: vector'你沒有。要把資源從使用中分解出來,不要兩者兼而有之。 – GManNickG 2010-08-09 03:07:47