如何解决指针随着抽象结构的子代而递增
我正在尝试通过增加指向该结构的指针来遍历属于抽象类的子结构的数组。 在我向该结构中添加成员之前,这一直有效,然后在尝试取消对指针的引用时导致内存访问冲突。 这是代码:
struct A {
virtual float Get() = 0;
};
struct B : A {
//int val;
B() {
// val = 0.f;
}
void Set(int v) {
//val = v;
}
float Get() override{
return 0.f; // val;
}
};
struct C : A {
A* previous;
int numPrev;
C() :
previous(nullptr),numPrev(0)
{}
float Get() override {
float v = 0.f;
A* p = previous;
for (int i = 0; i < numPrev; i++) {
v += p->Get();
p++;
}
return v;
}
void Register(A* prev,int count) {
previous = prev;
numPrev = count;
}
};
C* c;
B* b;
int main()
{
int count = 3;
b = new B[count]();
c = new C[count]();
B* curB = b;
for (int i = 0; i < count; i++) {
curB->Set(i);
curB++;
}
C* cur = c;
for (int i = 0; i < count; i++) {
cur->Register(b,count);
cur++;
}
float res = 0.f;
cur = c;
for (int i = 0; i < count; i++) {
res += c->Get();
cur++;
}
std::cout << res;
delete[] b;
delete[] c;
}
上面的代码可以编译并正常工作(据我所知),但是如果我取消注释struct B中的所有“ val”填充,它会突然抛出所提到的内存访问冲突。 我怀疑原因可能是结构C的Get()方法中的“ p ++”正以错误的数量递增,因为p是指向A的指针,但实际上我们处理的是B(它们是A的子代)。 然后将成员“ val”添加到B会导致sizeof(B)!= sizeof(A),因此p ++可能实际上不会跳到下一个元素,而是“进入”当前元素而导致违规? 不幸的是,将“ p ++”更改为“ p + = sizeof(A)”或“ p + = sizeof(B)”并不能解决此问题,因此我开始怀疑这还有其他问题...
有人知道什么会导致这种情况吗? 我只是对一个愚蠢的错误视而不见,还是有其他事情发生?
非常感谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。