2013-07-31 72 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'更好,因为新值不依赖于旧值。 –