我正在尝试在我的代码中实现工厂模式。
我尝试创建一个对象“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;
}
模拟.cpp:
void erzeugeFussundSchienbein() {
Koerperfabrik schienbeinfabrik = Schienbeinfabrik ();
schienbein = schienbeinfabrik.erzeugeKoerperteil(world);
}
当我尝试访问 (*schienbein).getBody() 时,我收到错误“Speicherzugriffsfehler (Speicherabzug geschrieben)”,它转换为“段错误(核心已转储)”。
我希望有人能帮助我。
最佳答案
你有未定义的行为。
这个类有一个函数应该返回一些东西,但没有:
class Koerperfabrik {
public:
Koerper *erzeugeKoerperteil(dWorldID welt);
protected:
// A return type no return value
// ~~~v~~~ ~v~
virtual Koerper* erzeugeKoerper(dWorldID welt) { };
};
你真的应该启用警告,因为你已经警告过你了。这是一个 godbolt example of the warning .在该示例中,我启用了 -Werror
以在出现警告时停止编译,但这是可选的。
我假设您想创建一个纯虚拟函数。
在 main 函数的代码中,您永远不会调用 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++ 中永远不会为 null,因此那里没有错误。工厂是使用默认构造函数隐式构造的。
最后,你有内存泄漏:
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);
关于c++ - 尝试实现工厂模式时如何修复 'Segmentation fault (core dumped)',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54594072/