Как исправить ошибку сегментации (ядро сброшено) при попытке реализовать Factory Pattern - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь реализовать шаблон фабрики в моем коде.

Я пытался создать объект "Koerper schienbein" и инициализировал его с помощью

schienbein.setRadius(0.2);
schienbein.setLaenge(1.0);
schienbein.setPosition(0, 0, 1.0);
schienbein.erzeugeBody(world); 

Поэтому я предполагаючто в классе "Koerper" нет ошибок.

Это мой код для моих фабрик.

Koerperfabrik.h:

class Koerperfabrik {

public:
    Koerper *erzeugeKoerperteil(dWorldID welt);

protected:
    virtual Koerper *erzeugeKoerper(dWorldID welt) { };

};

Koerperfabrik.cpp:

Koerper *Koerperfabrik::erzeugeKoerperteil(dWorldID welt) {
    Koerper *koerper = new Koerper ();
    koerper = erzeugeKoerper(welt);

    return koerper;
}

Schienbeinfabrik.cpp:

Koerper *Schienbeinfabrik :: erzeugeKoerper(dWorldID welt) {
    Koerper* schienbein = new Koerper ();
    (*schienbein).setRadius(0.2);
    (*schienbein).setLaenge(1.0);
    (*schienbein).setPosition(0, 0, 1.0);
    (*schienbein).erzeugeBody(welt);

    return schienbein;
}

Simulation.cpp:

void erzeugeFussundSchienbein() {
    Koerperfabrik schienbeinfabrik = Schienbeinfabrik ();
    schienbein = schienbeinfabrik.erzeugeKoerperteil(world);
}

Когда я пытаюсь получить доступ (* schienbein) .getBody (), я получаю ошибку «Speicherzugriffsfehler (Speicherabzug geschrieben)», которая переводится как «Ошибка сегментации (ядро сброшено)».

Я надеюсь, что есть кто-то, кто может мне помочь.

1 Ответ

0 голосов
/ 08 февраля 2019

У вас неопределенное поведение.

В этом классе есть функция, которая должна что-то возвращать, но это не так:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...