Problem mit Konstruktor
-
Hallo,
ich bin, wie man sich sicher denken kann, noch recht neu bei c++. Nun habe ich ein Problem und komme nicht auf die Lösung, daher dieser Post. Ich habe das dumpfe Gefühl das es etwas sehr simples ist, aber wie schon gesagt, ich komme nicht drauf.
Ich bin dabei eine Klasse zu schreiben, die es mir ermöglicht eine xml datei zu parsen und den inhalt dieser xml datei durch Methoden bereitzustellen.
Hier meine xmlParser.h. Nichts aufregendes nur die deklarationen der Methoden die ich haben möchte.
[cli]class xmlParser { private: XMLElement *root, *general, *simdata, *pillarlist; double to_double (const char *p); public: xmlParser(); xmlParser(const char *s); string getName(); string getAuthor(); string getDate(); string getComment(); string getDirection(); double getLength(); double getSpeed(); double getScale(); int getNrOfSupPoints(); matrix getVectorB(); matrix getYawVector(); };[/cli]Hier die dazugehörige xmlParser.cpp, welche die Methoden und Konstruktoren realisiert. Ich habe sie ein wenig gekürzt, denn die Methoden funktionieren und stellen nicht das Problem dar.
In dem Konstrukter lese ich halt die xml datei ein, parse diese mit XML track(s) und erzeuge mir das Pointer zu den richtigen Stellen in der xml Datei um es in den Methoden dann nicht wieder und wieder zu machen.
[cli]#include "xmlParser.h" xmlParser::xmlParser() {} xmlParser::xmlParser(const char *s) { XML track(s); if (track.ParseStatus() == 0 || track.IntegrityTest() == true) { root = track.GetRootElement(); //Getting the general data which are in the General block and //saving it in a usable structure //root (Rollercoaster) -> child (Track) -> child (General) general = root->FindElementZ("Track", false)->FindElementZ("General", false); //Getting the simulation data which are in the SimulationParameters //block and saving them in a usable structur //root (Rollercoaster) -> child (Track) -> child (SimulationParameters) simdata = root->FindElementZ("Track", false)->FindElementZ( "SimulationParameters", false); //Getting the coords of the support points and saving them in a matrix // root (Rollercoaster)-> child (Track)-> child (PillarList) pillarlist = root->FindElementZ("Track")->FindElementZ("PillarList", false); } else { cout << "no luck" << endl; } } //Helpermethode to typecast char to double double xmlParser::to_double(const char *p) { stringstream ss(p); double result = 0; ss >> result; return result; } //Getting the Name string xmlParser::getName() { char tmpname[100]; general->FindElementZ("Name", false)->GetContents()[0]->GetValue(tmpname); string name = tmpname; return name; } //Getting the Speed double xmlParser::getSpeed() { char tmpspeed[100]; simdata->FindElementZ("Speed", false)->GetContents()[0]->GetValue(tmpspeed); double speed = to_double(tmpspeed); return speed; }[/cli]Dazu kommt noch eine kleine test datei, testmain.cpp:
[cli]#include "xmlParser.h" int main(int argc, char *argv[]) { xmlParser xml("xml-example-rollercoaster.xml"); string name = xml.getName(); cout << name << endl; return 0; }[/cli]Mein Problem ist nun, das diese keine Ausgabe liefert. Ich bin fast sicher das es an dem Konstruktor liegt, aber nicht warum bzw wie es richtig wäre. Wäre schön wenn mir jemand einen tipp geben könntet was ich da falsch mache.
Lisa
-
Hast du es mal so probiert:
xmlParser *xml = new xmlParser("xml-example-rollercoaster.xml"); ... delete xml;Bzw. überhaupt mal mit dem Debugger geschaut ob die zurückgelieferte Adresse und das Objekt dahinter in Ordnung sind?
-
Ja so habe ich es auch schon probiert, keine Veränderung.
Ich hatte das Programm vorher komplett in einer main laufen, ohne methoden, da hat alles funktioniert, erst als ich es in Methoden und Konstruktor umgewandelt habe funktionierte es nichtmehr, daher kam auch meine Vermutung das es an dem Konstruktor liegt.