gpt4 book ai didi

vector 中的 C++ 多态类指针

转载 作者:行者123 更新时间:2023-11-28 02:26:34 24 4
gpt4 key购买 nike

假设我有以下代码,简而言之,它有:

  • 一个BaseClass带有指向 PointerClass 的指针
  • 一个ChildClass继承自 BaseClass
  • 一个HolderClass有一个 std::vectorChildClass s 和一个 std::vectorBaseClass*小号:

整个代码如下:

#include <stdlib.h>
#include <time.h>
#include <vector>

class PointerClass {
public:
int num;
double num2;
PointerClass() {
srand(time(NULL));
num = rand() % 100;
num2 = rand() % 100 / 2.0;
}
};


class BaseClass {
public:
PointerClass *pointerClass;
};


class ChildClass: public BaseClass {
public:
ChildClass() {
pointerClass = new PointerClass();
}
};


class HolderClass {
public:
std::vector<BaseClass*> basePointerVec;
std::vector<ChildClass> childVec;

HolderClass() {

}

void addParentClass() {
ChildClass childClass = ChildClass();

childVec.push_back(childClass);
basePointerVec.push_back(&childClass);
}
};


int main(int argc, const char * argv[]) {

HolderClass holderClass = HolderClass();

for (int count = 0; count < 20; count++) {
holderClass.addParentClass();
}

for (int count = 0; count < holderClass.basePointerVec.size(); count++) {
delete holderClass.basePointerVec[count]->pointerClass;
}

return 0;
}

我的问题是,在添加指向 ChildClass 的指针之后进入std::vector<BaseClass*> basePointerVec和实际的ChildClass进入std::vector<ChildClass> childVecaddParentClass() HolderClass 中的方法, basePointerVec 中的数据和 childVec完全不同。

此外,当我尝试释放 PointerClass来自 childVec 的 es ,一切正常。但是当我尝试将它们从 basePointerVec 中释放出来时相反,我收到一条错误消息,告诉我我正在尝试释放一个我尚未为其分配内存的指针。

果然,当我使用断点检查所有内容时,我发现了一些奇怪的行为。好像每次打电话都是ChildClass childClass = ChildClass();addParentClass() , basePointerVec 中的每个指针更改为指向新创建的 ChildClassBaseClass .

我在实际程序中这样做的目的是利用多态性并让多个类继承自 BaseClass .

所以我的问题是,为什么 vector 中的每个指针都被更改为指向新创建的类,我该如何修复它?

附言很抱歉这个问题的长度,这是我能做到的最短

最佳答案

    childVec.push_back(childClass);

类 vector 的push_back方法复制对象。所以在这种情况下添加的对象与 childClass 不同。

您不能从 basePointerVec 中删除指针,因为它们不是用 new 分配的,而是在本地分配的,并且它们在 addParentClass 的末尾被删除。因此,addParent 的代码是错误的,因为您在 vector 中推送的指针在该方法结束后不再有效,并且可能导致段错误(在最好的情况下)。这里有一个改进建议:

void addParentClass() {
ChildClass* childClass = new ChildClass();

childVec.push_back(*childClass);
basePointerVec.push_back(childClass);
}

内存现在是动态分配的,你应该确保用 delete 释放这些指针。

编辑:

void addParentClass() {
childVec.push_back(ChildClass());
basePointerVec.push_back(&childVec.back());
}

如果您使用的是 C++11:

void addParentClass() {
childVec.emplace_back();
basePointerVec.push_back(&childVec.back());
}

关于 vector 中的 C++ 多态类指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30436560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com