Warum Segmentation fault?
-
Hi,
auf meinem Weg ein MVC Pattern in C++ zu implementieren ist mir ein Fehler unterlaufen, den ich auch nach diversen Stunden Recherche selbst nicht beheben konnte.
Vielleicht kann mir hier jemand sagen, was ich ändern muss, damit der folgende Code nicht in einer endlosen Schleife mündet, die schließlich mit Segmentation fault abbricht?
Wollte eigentlich nur einen Controller schreiben, der ein Model ins Leben ruft und sich bei diesem registriert usw.
Besten Dank!/** * * mvc.cpp * **/ #include "controller.h" using namespace std; int main(){ Controller(); return 0; } /** * * controller.h * * */ #ifndef __CONTROLLER__ #define __CONTROLLER__ #include <string> using namespace std; class Controller{ private: string m_strMessage; public: Controller(); // Konstruktor. }; #endif // __CONTROLLER__ /** * * controller.cpp * **/ #include "controller.h" #include "model.h" Controller::Controller(){ cout << "Konstruktor meldet: Baue Controller auf" << endl; cout << "Konstruktor meldet: Baue Model auf" << endl; Model *m = new Model(); cout << "Model meldet: " << endl; string message = m->getMessage(); cout << message << endl; cout << "Konstruktor meldet: Verlasse den Konstruktor..." << endl; } /** * * model.h * **/ #ifndef __MODEL__ #define __MODEL__ #include <iostream> #include <string> #include "controller.h" using namespace std; class Model{ private: string m_strMessage; Controller m_cController; public: Model(); string getMessage() const; void setMessage(string s); }; #endif // __MODEL__ /** * * model.cpp * **/ #include "controller.h" #include "model.h" Model::Model(){ setMessage("Model erzeugt!"); } string Model::getMessage() const{ return this->m_strMessage; } void Model::setMessage(string s){ this->m_strMessage = s; }
-
Weil dein Controller ein Model im Konstruktor erzeugt und dein Model einen Controller als Member-Variable hat -> Endlosschleife -> Speicherüberlauf -> Segmentation Fault
-
Hast recht. Hab die Membervariable m_cController auskommentiert und schon lief's rund. Danke soweit.
Allerdings verstehe ich den Prozess noch nicht.
Wird der Konstruktor bereits durch die Deklaration einer Membervariablen aufgerufen?
Wenn ja, wie kann ich den Controller und später auch das View im Modell registrieren? Wäre es sinnvoll, die Members vielleicht durch den Konstruktor des Modells anlegen zu lassen? Versuche ich gleich mal...
Während dessen wäre ein Wink mit dem Zaunpfahl sehr nett...

Besten Dank!
-
Tach,
hab's nun herausgefunden und geb' hier mal selbst die Antwort. Mittlerweile hab ich herausgefunden, dass das Zauberwort im obigen Zusammenhang 'Vorwärtsdeklaration' lautet. Wer mehr über Vorwärtsdeklarationen erfahren möchte, kann z.B. unter http://www.cpp-tutor.de/cpp/le11/le11_02.htm mehr heraus finden.
Grob gesagt geht es darum, den Compiler rechtzeitig, d.h. vor der Deklaration von Objekten zu unterrichten, dass die Typenbeschreibungen selbsterstellter Typen auch existieren und noch nachgeliefert werden. Hoffe, das hilft.Gruß, h3lium