2013-07-31 2 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; 

И я бы на самом деле признал ommend you to не использовать указатели вообще, поэтому никакой другой инициализации действительно не понадобится.

+2

Если мы будем переводить алгоритмы, 'generate', вероятно, будет лучше, чем' transform', так как новое значение никоим образом не зависит от старого значения. –

Смежные вопросы