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

Creating and adding object from base class to derived class array

本文关键字:派生 数组 添加 基类 创建对象      更新时间:2023-10-16

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

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

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

还有一些额外的二传手和getter。然后我有了这个派生类:

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

但它在中途坠毁了。每次使用cout时,我都会将默认的CPerson()构造函数设置为消息"Inserted"。因此,如果我调用主CData database(4),它应该在屏幕上打印4次"Inserted(插入("。相反,它只打印了2次,然后就崩溃了。

您正试图使用指向CPerson的指针作为数组。如果您在构建时动态分配了一个数组,那将是正确的,但这是一个您不想真正处理的麻烦。

值得庆幸的是,C++标准创建了一个非常有用的实用程序std::vector,您可以使用它:

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

然后:

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

最美妙的是,你的nrOfPersons成员对象也神奇地消失了。要检索大小,只需调用Data_array.size()即可。

您需要为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