Textdatei einlesen und trennen...
-
du hast nur vergessen die fkt zu definieren:
void Nachfolger( KnotenPtr next, int gewicht );Und deshalb geht das kompilieren auch fehlerfrei und erst beim Linken am Ende sagt dir der Linker die Fehlermeldung:
Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall knoten::Nachfolger(class knoten *,int)" (?Nachfolger@knoten@@QAEXPAV1@H@Z)" in Funktion ""class std::map<int,class knoten *,struct std::less<int>,class std::allocator<struct std::pair<int const ,class knoten *> > > __cdecl readFromFile(class std::basic_istream<char,struct std::char_traits<char> > &,class std::basic_istream<char,struct std::char_traits<char> > &)" (?readFromFile@@YA?AV?less@H@std@@V?pair@$$CBHPAVknoten@@@std@@@3@@std@@AAV?char_traits@D@std@@@2@0@Z)"
Das nicht mehr fette ist nicht mehr ganz so interessant... Da sagt er dir z.Bsp. in welcher Fkt die nicht definierte aufgerufen werden soll - das sieht hier nur bissl extrem unübersichtlich aus, weil er alle typen vollständig hinschreibt...
bb
-
jup daran lags, super!
wie kann ich das denn jetzt ausgeben das ich zu einem beliebigen punkt alle kanten bekomme? muss glaub ich nochmal über deinen code schauen, ist ein bischen viel auf einmal...
-
palmdale schrieb:
Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall knoten::Nachfolger(class knoten *,int)"
Hallo Palme,
ich hatte vergessen, Dir die Implementierung dieser Methode zu posten. In Knoten.cpp muss noch eingefügt werden:
void knoten::Nachfolger( KnotenPtr nachfolger, int gewicht ) { m_nachfolger.push_back( Next( nachfolger, gewicht ) ); }D.h. aus dem Nachfolger-Knoten (bzw. dem Pointer auf diesen) und dem Gewicht wird ein Objekt der Struktur 'Next' erzeugt und das wird mit in den vector der Nachfolger aufgenommen (push_back).
palmdale schrieb:
wie kann ich das denn jetzt ausgeben das ich zu einem beliebigen punkt alle kanten bekomme? muss glaub ich nochmal über deinen code schauen, ist ein bischen viel auf einmal...
inden Du z.B. die Ausgabe-Funktion des Knotens aufmotzt. Ein Knoten ist nun mehr als ein Index und der Straßenname. Also in knoten.cpp:
// -- Ausgabe (ersetzt: string knoten::print() ) std::ostream& operator<<( std::ostream& out, const knoten& k ) { out << k.index << "; " << k.name; if( !k.m_nachfolger.empty() ) out << "\n"; // Nachfolger in die nächste Zeile schreiben // Bem.: erfordert #include <algorithm> (copy) und #include <iterator> (ostream_iterator) und Streaming-Operator für Next copy( k.m_nachfolger.begin(), k.m_nachfolger.end(), std::ostream_iterator< knoten::Next >( out, "; " ) ); return out; }und weil jetzt die Ausgabe von knoten::Next benötigt wird, auch in knoten.cpp
// -- Streaming-Operator für Next std::ostream& operator<<( std::ostream& out, const knoten::Next& kante ) { return out << "(" << kante.m_gewicht << ")-> " << kante.m_nachfolger->Index(); }und im Header (knoten.h) noch die Deklaration des Streamingoperators
struct Next { Next( KnotenPtr nachfolger, int gewicht ) : m_nachfolger( nachfolger ), m_gewicht( gewicht ) {} friend std::ostream& operator<<( std::ostream& out, const knoten::Next& kante ); // usw. ...So kannst Du auch den Graphen nach dem Einlesen wieder ausgeben - im main() zu ändern:
Graph graph = readFromFile( inFileKnoten, inFilePfeil ); // Lesen aus den Dateien for( Graph::iterator i = graph.begin(); i != graph.end(); ++i ) { cout << *(i->second) << endl; }.. was dann noch fehlt ist das Aufräumen im Speicher! Kannst Du boost.shared_ptr benutzen?
Gruß
Werner
-
eigentlich nur native c++, d.h. so viel wie möglich selber beasteln

-
Du kannst natürlich auch einen
shared_ptrselber basteln.
Vielleicht nicht mit der Komplexität wie bei Boost, aber die wichtigen Dinge wie Referenzzählung sollten nicht allzu schwer zu implementieren sein.
-
hier kann geschlossen werden, vielen dank allen, die mir geholfen haben... konnte mein projekt dadurch erfolgreich abschliessen... (besonderen dank an werner für die geopferte zeit (auch während des grand prix ;)))