2015-05-17 6 views
1

У меня есть проблема с созданием и добавление объектов в массив Это мой базовый класс:Создание и добавление объекта из базового класса производного класса массива

class CPerson 
{ 
    std::string first_name; 
    std::string last_name; 
    int birth_year; 
    char sex; 


public: 
    CPerson(); 
    CPerson(std::string, std::string,int,char); 

с некоторыми дополнительными сеттеров и добытчиками. Тогда у меня есть это производный класс:

class CData : 
    public CPerson 
{ 
    int nrOfPersons; 
    CPerson *Data_array; 
public: 
    CData(int); 
    ~CData(); 
}; 

В конструкторе я хочу, чтобы заполнить Data_array с объектами человека, и я следующее:

CData::CData(int x) : nrOfPersons(x) 
{ 
    for (int i = 0; i < nrOfPersons; i++) 
     Data_array[i] = CPerson(); 
} 

Но он выходит из строя на полпути. Я сделал default CPerson() constructor до cout сообщение "Inserted" everytime I use it. Поэтому, если я позвоню в главный CData database(4), он должен напечатать «Inserted» 4 раза на экране. Вместо этого он печатает только 2 раза, а затем сбой.

+0

где вы выделить память для 'Data_array'? –

+4

CData не должны наследоваться от CPerson. Список людей - это не человек. – Mat

ответ

3

Вы пытаетесь использовать указатель на CPerson в качестве массива. Это было бы правдой, если бы вы динамически выделяли массив при построении, но это много хлопот, с которыми вы действительно не хотите иметь дело.

К счастью, стандарт C++ создал очень полезную утилиту под названием std::vector, что вы можете использовать:

class CData : public CPerson 
{ 
    std::vector<CPerson> Data_array; 
    // ... 
}; 

, а затем:

CData::CData(int n) 
    : Data_array(n) 
    {} 

И самая красивая вещь о том, что ваш nrOfPersons член объект также магически исчезает. Чтобы получить размер, вы можете просто позвонить Data_array.size() и вуаля.

-1

Вам нужно выделить память для Data_array:

CData::CData(int x) : nrOfPersons(x) 
{ 
    // allocate memory 
    Data_array = new CPerson[nrOfPersons]; 

    // fill array 
    for (int i = 0; i < nrOfPersons; i++) 
     Data_array[i] = CPerson(); 
} 

Не забудьте удалить выделенный массив впоследствии (в деструкторе, например):

delete[] Data_array 
+0

Удаление 'Data_array' в деструкторе - это не единственное, что необходимо для обеспечения безопасности этого класса. – Shoe

+0

Скажите, пожалуйста, какой? –

+0

Что значит «какой»? – Shoe

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