gpt4 book ai didi

c++ - 未调用覆盖的虚函数

转载 作者:行者123 更新时间:2023-11-28 00:21:45 25 4
gpt4 key购买 nike

我有一个具有多个虚函数的结构对象

对象.h

struct object {
public:
...
virtual float intersect(Point, Vector, object*, Point*);
virtual Vector normal(Point, object*);
};

并且它们在另一个名为 sphere 的结构中实现

球体.h

struct sphere: public object {
...
// intersect ray with sphere
float intersect(Point, Vector, object*, Point*) override;
// return the unit normal at a point on sphere
Vector normal(Point, object*) override;
};

我创建并存储指向 vector 中球体的指针,通过

extern vector<object*> scene;
sphere *new_sphere;
new_sphere = (sphere *) malloc(sizeof(sphere));
...
scene.push_back(new_sphere);

所以当我尝试使用以下代码调用 intersect 时会出现问题

extern std::vector<object*> scene;
...
object *intersect_scene(Point p, Vector u, Point *intersect, int ignore) {
for (vector<object*>::iterator it = scene.begin(); it != scene.end(); ++it) {
float intersect_point = (*it)->intersect(p, u, *it, &temp_hit);
}

我从 gdb 得到以下错误

Program received signal SIGSEGV, Segmentation fault.
0x00000000004042ef in intersect_scene (p=..., u=..., intersect=0x7fffffffdcd0,
ignore=-1) at trace.cpp:70
70 float intersect_point = (*it)->intersect(p, u, *it, &temp_hit);

有人可以告诉我这里发生了什么吗?

根据要求:

struct Point{
float x;
float y;
float z;
};

struct Vector{
float x;
float y;
float z;
};

最佳答案

不要使用malloc 来构造非POD 对象。请改用 new

malloc 所做的只是分配字节——它构造对象。您的 sphere 对象具有虚函数,派生自基类等。这些类型必须正确构造,而 malloc 不会完成这项工作。

此外,如果您调用了free(),它们也必须更改为调用delete

就对象构造而言,唯一使用 malloc 的情况是您正在使用 placement-new,而您的代码并未这样做。

关于c++ - 未调用覆盖的虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27162314/

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