我的程序中有一个基类和两个子类。 我对c ++完全不熟悉,也不是 我有类似于以下循环的东西:
baseclass * arr[10];
for (i = 0; i < 10; i++) {
if (some condition) {
SubclassA subA;
subA = SubclassA(stuff);
arr[i] = &subA;
}
else if (some other condition) {
SubclassB subA;
subB = SubclassB(stuff);
arr[i] = &subB;
}
}
当我运行我的代码并首先创建一个SubclassA并将其地址分配给我的数组时。 然而,我发现以下情况正在发生:在上一步之后,当我稍后在循环中创建一个SubclassB时,由于某种原因,SubclassB是在我的SubclassA所在的同一个内存位置进行的:它&#39;完全覆盖我的第一个物体,我不明白为什么。
答案 0 :(得分:3)
在C ++中subA = SubclassA(stuff);
并不意味着分配和创建一个全新的对象,然后为它分配一个引用。 subA
是一个本地对象,一旦到达封闭的}
,它就会消失。您无法将其地址存储到阵列中。
您需要使用new
实际分配新对象,并且最好使用智能指针来控制所有权和生命周期:
Typedef std::array<std::unique_ptr<baseclass>, 10> ArrType;
ArrType arr;
for (i = 0; i < 10; i++)
{
if (some condition)
{
arr[i] = ArrType::value_type(new SubclassA(stuff));
}
else if (some other condition)
{
arr[i] = ArrType::value_type(new SubclassB(stuff));
}
}
答案 1 :(得分:1)
您需要使用指针并创建new
个对象以添加到数组中,而不是使用本地对象。
baseclass * arr[10];
for (i = 0; i < 10; i++) {
if (some condition) {
arr[i] = new SubclassA(stuff);
}
else if (some other condition) {
arr[i] = new SubclassB(stuff);
}
}
并且不要忘记你需要完成数组并在完成后删除指针。
for (i = 0; i < 10; i++) {
delete arr[i];
}
答案 2 :(得分:1)
尝试在子类中使用new
baseclass * arr[10];
for (i = 0; i < 10; i++) {
if (some condition) {
SubclassA subA = new SubclassA(stuff);
arr[i] = subA;
}
else if (some other condition) {
SubclassB subB = new SubclassB(stuff);
arr[i] = subB;
}
}
答案 3 :(得分:1)
您正在存储指向局部变量subA
和subB
的指针。当变量超出范围时,对象将被删除,指针将悬空。
要修复它,您必须使用动态内存分配。建议使用std::unique_ptr
等智能指针管理动态分配的内存。
std::vector<std::unique_ptr<baseclass>> arr;
for (int i = 0; i < 10; i++) {
if (some condition) {
arr.push_back(std::make_unique<SubclassA>());
} else if (some other condition) {
arr.push_back(std::make_unique<SubclassB>());
}
}