У меня есть объект структуры, которая имеет несколько виртуальных функцийперекрываться Виртуальная функция не называется
object.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;
};
I и создавать и хранить указатели на сферы в векторе через
extern vector<object*> scene;
sphere *new_sphere;
new_sphere = (sphere *) malloc(sizeof(sphere));
...
scene.push_back(new_sphere);
Так что проблема происходит, когда я пытаюсь вызова пересекаются со следующим кодом
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;
};
«Может кто-нибудь дать мне некоторое представление о том, что здесь происходит?» Мы не знаем, где, когда и как этот код вызывается, мы не знаем состояния любой из этих переменных, которые вы вызов и т. д. Излишне говорить, что вам нужно изолировать проблему и придумать полный пример, который показывает ошибку. Поскольку вы используете указатели и динамически распределенную память, очевидная причина связана с неправильным управлением памятью/указателем где-то в вашем приложении. – PaulMcKenzie
Что такое 'Point'? Что такое «Вектор»? Вы передаете их по значению (по крайней мере, это то, что предлагает этот код). Это означает, что у них лучше работают рабочие копии, которые выполняют правильные копии. – PaulMcKenzie
Точка и векторы - две структуры. Я надеялся, что это будет так просто, как ваш итератор неверен – Wusiji