从基类创建对象并将其添加到派生类数组
Creating and adding object from base class to derived class array
我在创建对象和将对象添加到数组中时遇到问题这是我的基类:
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
相关文章:
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 如何使用数据成员填充派生类的对象到基类的指针数组中
- std::数组派生类聚合初始化
- 指向不同派生类的指针数组
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 从基类数组调用派生函数
- 如何创建一个动态数组,该数组可以保存从C++中派生的同一基类的所有不同对象
- 如何在C 中的派生类中分配数据成员数组
- 在C 中的数组中存储抽象基类的不同派生类的对象
- 使用数组作为对象调用派生类的方法
- 我怎么知道基类对象的指针数组中元素的类型,它将为派生类分配内存
- 如何将基类指针数组强制转换为派生类
- 如何使数组的派生类型接受聚合初始化?
- 指向基类数组的指针,填充派生类
- 在单个指针数组中调用不同派生类的虚拟方法
- 基类的C++数组,该数组的元素中存储有派生类的实例
- 基类和派生类的二维动态数组
- 将派生对象添加到(抽象的)基指针数组中
- 如何对派生模板类C++中的对象数组进行排序
- 矢量强制转换与派生对象到基对象的数组转换