2013-07-31 119 views
1

的向量()函數:我想初始化的for_each指針的向量的for_each指針的指針

#include <stdlib.h> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
using namespace std; 

class Cow{ 
     public: 
       Cow(){ _age = rand()% 20; } 
       int get_age() { return _age;} 
     private: 
       int _age; 
}; 

void add_new(Cow* cowp) 
{ 
     cowp = new Cow; 
} 

int main() 
{ 
     srand(time(NULL)); 
     const int herd_size=10; 
     vector<Cow*> herd(herd_size); 
     for_each(herd.begin(), herd.end(),add_new); 
     cout << "Age: " << herd[0]->get_age() << endl; // line 27 
} 

不過,我在27行牛羣得到一個運行「分段錯誤」錯誤矢量似乎是未初始化的。爲什麼?

+3

請''設置nonu'並在註釋中標註所需的行,以便我們可以複製粘貼代碼並進行編譯而不會混淆。 –

+0

@jdero「add_new」是向量的每個元素上的回調函數。 – Mahesh

+0

請不要包含行號,這會讓人很難複製和粘貼。只需在評論中標註必要的行。 – BoBTFish

回答

8

您的函數按指針取值,然後重新分配這些副本。您需要通過引用將它們引入以影響向量中的指針。

void add_new(Cow *& cowp) 
4
void add_new(Cow* cowp) 
{ 
     cowp = new Cow; 
} 

你只是修改您的Cow指針的本地版本。請記住,一個局部變量在離開它的函數時被銷燬,並且在這裏你的指針被作爲值傳遞!

你想修改駐留您的載體裏面的指針,所以你需要引用:

void add_new(Cow *& cowp) 
{ 
    cowp = new Cow; 
} 

這樣,你得到有效的修改駐留在您的載體原來的指針。

2

對於這個std::generate是一個更好的匹配,因爲它應該用於生成一個序列。

的另一個重要變化是,你的函數必須採取參考指針:

void add_new(Cow*& cowp) 

其實,你並不真的需要使用std::for_each甚至std::transform,或者使用獨立的創建功能,這要感謝新的C++ 11功能:

for (auto& cow : herd) 
    cow = new Cow; 

而且我真的會rec如果你不想要而不是使用指針,那麼就不需要其他初始化。

+2

如果我們正在切換算法,'generate'可能會比'transform'更好,因爲新值不依賴於舊值。 –