Laufzeitproblem mit Konstruktor
-
Hallo allerseits.
Bin leider nur in C bewandert und in C++ noch leicht newbie-mäßig. Also hab ich mal eine Frage zu einer von mir definierten Klasse.
Der Code, um den es geht, sieht ungefähr so aus:struct knoten{ knoten *next; knoten *before; knoten(int w=0, string s=0, knoten *n=0, knoten *b=0):wert(w),schluessel(s),next(n),before(b){} }; class kmenge{ public: kmenge(void); //... private: knoten *kopf; knoten *ende; }; //... kmenge::kmenge(){ kopf=new knoten(0,0,0,0); //... } //... int main(void){ kmenge menge1; //... }
D.h. das Problem dreht sich um die Klasse kmenge, die sich auf die Struktur knoten bezieht. Somit soll eine Menge mittels einer verketteten Liste realisiert werden. Sinn oder Unsinn ist egal, nur eine kleine Programmierübung
Also ein struct kann in C++ ja einen Konstruktor haben, im Anschluss daran kommt die Initialisierungsliste, das müsste ja eigentlich i.O. gehen, oder? Nunja, auf jeden Fall lässt sich das Ganze kompilieren.Beim Ausführen des Programms dann die böse Überraschung:
bash$: ./kmenge
Abortedgdb bringt folgende Ausgabe:
Program received signal SIGABRT, Aborted.
0x41042571 in kill() from /lib/libc.so.6Nunja, da es sich kompilieren lässt, ist es zumindest kein Syntaxfehler. Ich vermute, es hängt mit dem Konstruktor in struct knoten() zusammen. Schreib ich das um und lasse die Parameter "knoten *n, knoten *b" weg, so funzt es. Aber ich will es nicht umschreiben, weil es mir einfach ums Prinzip geht, warum da einfach SIGABRT gesendet wird. Ich meine, es ist ja nicht verboten, sich in einer Struktur auf einen Zeiger derselben Struktur zu beziehen...
Weiß jemand Rat? Bei solchen Problemen kämpft man nämlich echt manchmal mit der Verzweiflung
Danke schonmal,
RTC
-
Poste doch mal ein ausführbares Minimalbeispiel, bei dir fehlt ja zum Beispiel die Membervariable wert in der Struktur knoten, vielleicht hast du ja noch mehr wichtige Sachen weggelassen...Mir ist außerdem neu, dass man einen std::string mit 0 initialisieren kann als default Parameter, ich dachte man müsste "" nehmen.
-
dein code ist sowei korrekt. zeig mal das ganze kaputte programm.
-
Wenn du nicht knoten(0,0,0,0) aufrufst sondern knoten(0,"",0,0) dann funktioniert es.
Du solltest dann bei deiner default Initialisierung auch nicht string s=0 sondern string s="" schreiben.
Dann frage ich mich allerdings warum du Defaultwerte angibst und dann beim Aufruf genau diese Werte übergibst, das brauchst du dann ja nicht mehr machen, du kannst dann einfach knoten() schreiben, das hat den gleichen Effekt.Ich kann dir aber im Moment nicht sagen was das Problem ist.
-
KPC schrieb:
Mir ist außerdem neu, dass man einen std::string mit 0 initialisieren kann als default Parameter, ich dachte man müsste "" nehmen.
das ist dann ein null Zeiger. Ups, std::strings Konstruktor darf aber kein 0 Zeiger sein - da haben wir's.
-
Klar, daran lag es. Danke vielmals für die Lösung des Problems. Wieso kann der g++ da keine Warnung und nichts ausgeben, das ist schon komisch...
War noch nicht so mit der Klasse string vertraut, wie gesagt -> C-Umsteiger
Danke nochmals...
RTC