创建基类的对象并将其添加到派生类数组

时间:2015-05-17 11:38:21

标签: c++ arrays object

我在创建数组并将对象添加到数组时遇到问题 这是我的基类:

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();
};

在构造函数中,我想用person对象填充Data_array,并执行以下操作:

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

但它在那里中途崩溃了。每当我使用它时,我都会将默认的CPerson()构造函数设为cout一条消息“已插入”。因此,如果我在主CData database(4)中打电话,它应该在屏幕上打印“插入”4次。相反,它只打印2次然后崩溃。

2 个答案:

答案 0 :(得分: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 :(得分:-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