- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有以下代码,简而言之,它有:
BaseClass
带有指向 PointerClass
的指针ChildClass
继承自 BaseClass
HolderClass
有一个 std::vector
的 ChildClass
s 和一个 std::vector
的 BaseClass*
小号:整个代码如下:
#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> childVec
在addParentClass()
HolderClass
中的方法, basePointerVec
中的数据和 childVec
完全不同。
此外,当我尝试释放 PointerClass
来自 childVec
的 es ,一切正常。但是当我尝试将它们从 basePointerVec
中释放出来时相反,我收到一条错误消息,告诉我我正在尝试释放一个我尚未为其分配内存的指针。
果然,当我使用断点检查所有内容时,我发现了一些奇怪的行为。好像每次打电话都是ChildClass childClass = ChildClass();
在addParentClass()
, basePointerVec
中的每个指针更改为指向新创建的 ChildClass
的 BaseClass
.
我在实际程序中这样做的目的是利用多态性并让多个类继承自 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/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!