У вас неопределенное поведение.
В этом классе есть функция, которая должна что-то возвращать, но это не так:
class Koerperfabrik {
public:
Koerper *erzeugeKoerperteil(dWorldID welt);
protected:
// A return type no return value
// ~~~v~~~ ~v~
virtual Koerper* erzeugeKoerper(dWorldID welt) { };
};
Вы действительно должны включить предупреждения, так как предупреждения вы предупреждалидля этого.Вот пример удара Годболта .В этом примере я включил -Werror
, чтобы остановить компиляцию при предупреждении, но это необязательно.
Я предполагаю, что вы хотели создать чисто виртуальную функцию.
В коде вашей основной функции вы никогда не вызовете Schienbeinfabrik
:
// You care creating a new Koerperfabrik
// | Here you copy a Schienbeinfabrik into it
// v-------------v ~~~~~~~~~v~~~~~~~~~
Koerperfabrik schienbeinfabrik = Schienbeinfabrik ();
schienbein = schienbeinfabrik.erzeugeKoerperteil(world);
Переменная schienbeinfabrik
всегда имеет тип Koerperfabrik
, который не являетсячто ты намеревалсяВместо этого вы должны сделать это:
// construct a new Schienbeinfabrik
Schienbeinfabrik schienbeinfabrik;
// call something on it
schienbein = schienbeinfabrik.erzeugeKoerperteil(world);
Объекты никогда не равны нулю в C ++, поэтому там нет ошибок.Фабрика неявно создается с использованием конструктора по умолчанию.
Наконец, у вас есть утечка памяти:
Koerper *Koerperfabrik::erzeugeKoerperteil(dWorldID welt) {
Koerper *koerper = new Koerper (); // a new Koerper
// You reassign the pointer, you loose
// reference to the previous koerper
koerper = erzeugeKoerper(welt);
return koerper;
}
Просто удалите новое:
Koerper* koerper = erzeugeKoerper(welt);