[ERLEDIGT] Klassendaten Zusammenfügen



  • Hallo Leute,

    ich habe eine Topologieklasse die: Koordinaten,Knoten,Kanten,Maschen enthält.

    Jetzt möchte ich eine Funktion schreiben die zwei solcher Klassen zusammenfügen kann.
    Dass heisst dass die Koordinaten,Knoten,..., im endeffekt zusammengschmissen werden.

    Wie funktioniert dabei der C++ Teil?

    habe versucht eine funktion dafür zu schreiben aber irgendwie möchter er das nicht.
    Geht man so etwas mit einer Operatorüberladung an oder gibt es einfachere Wege?



  • Zeig mal deine Versuche.
    Oder zeig doch mal ein Minimal Bsp. was tu tun möcgtest.

    Simon


  • Mod

    Die Frage ist zu allgemein gestellt. Es gibt viele Wege zum Ziel, manche sind manchmal besser, manchmal andere.

    Von deiner vagen Problembeschreibung ausgehend:
    Zusammenfügen von Klassen würde ich mit Addition, also dem Operator + assoziieren. Daher würde ich diesen Operator überladen.



  • Eigenlich wollte ich euch den Code ersparen 🙂
    Hier sind die drei Datenkontainer die dann zusammengefügt werden sollten.

    class TOP{
    
    	private:
    		....
    		std::map<UINT, UTM,  std::less<UINT>> COORDs;
    		std::map<UINT, Knot, std::less<UINT>> knots;
    		std::map<UINT, Edge, std::less<UINT>> edges;
    		....
    }
    

    Jetzt wollte ich:

    void TOP::add_topology(TOP &new_topology){
    	if(TOP.integrity_check()){
    		tmp = (*this);
    		...
    }
    

    Wird so etwas funktionieren? Allein die erste Zeile riecht mir schon irgendwie faul..

    Mein zweiter Ansatz ist:

    GEOTopology GEOTopology::operator+=(const GEOTopology &new_topology ) {
    
    	GEOTopology thistopology(*this);
    
    	if(new_topology.integrity_check()){
    	...
    	}
    }
    

  • Mod

    Das ist syntaktisch erstmal richtig (wobei operator += meistens eine Referenz zurückgeben sollte und new_topology sollte wohl eher const sein oder willst du es ändern?). Ob die Semantik stimmt, kannst nur du beantworten, denn wir wissen ja nicht, wie man deine Klassen korrekt zusammenfügt.



  • SeppJ schrieb:

    Das ist syntaktisch erstmal richtig (wobei operator += meistens eine Referenz zurückgeben sollte und new_topology sollte wohl eher const sein oder willst du es ändern?). Ob die Semantik stimmt, kannst nur du beantworten, denn wir wissen ja nicht, wie man deine Klassen korrekt zusammenfügt.

    Meinst du so?

    GEOTopology GEOTopology::operator+=(const GEOTopology &new_topology ) const{
    
        GEOTopology thistopology(*this);
    
        if(new_topology.integrity_check()){
        ...
        }
    }
    

    Darf ich dann thistopology verändern?
    Was ist mit dem ersten Versuch?



  • Eher so;

    GEOTopology &GEOTopology::operator+=(const GEOTopology &new_topology ){
        if(new_topology.integrity_check()){
        ... // this->map_1 erweitern um new_topology.map_1 etc.
        }
    
        return *this;
    }
    

  • Mod

    Nein ich meinte so:
    Versuch 1:

    void TOP::add_topology(const TOP &new_topology)
    

    Wäre komisch wenn sich etwas verändert weil ich es zu etwas anderem hinzufüge

    Versuch 2:

    GEOTopology& GEOTopology::operator+=(const GEOTopology &new_topology )
    

    Ist die übliche Schreibweise. Dadurch werden Kettenzuweisungen möglich à la (x+=1)+=2; . Keine Ahnung wozu das gut sein soll, aber bei ints geht das. Und eine gute Faustregel für Operatorüberladung ist, dass das was für ints gut ist, auch für andere Klassen gut ist.



  • SeppJ schrieb:

    Nein ich meinte so:
    Versuch 1:

    void TOP::add_topology(const TOP &new_topology)
    

    Wäre komisch wenn sich etwas verändert weil ich es zu etwas anderem hinzufüge

    Achso. Man muss tatsächlich etwas ändern.
    Wenn sich durch die hinzugefügten Punkte der Fall
    ergibt dass zwei Punkte übereinanderliegen,
    wäre es topologisch gesehen ein Fehler.

    Dann müssten die zwei Punkte zu einem Zusammgengefasst werden.

    Wenn sich zwei Linien schneiden würden,
    müsste man den Schnittpunkt als Knoten anlegen
    und so weiter..

    Da ich sonst ein temporäres Objekt anlegen müsste arbeite ich lieber direkt mit diesem Objekt.



  • Fellhuhn schrieb:

    Eher so;

    GEOTopology &GEOTopology::operator+=(const GEOTopology &new_topology ){
        if(new_topology.integrity_check()){
        ... // this->map_1 erweitern um new_topology.map_1 etc.
        }
    
        return *this;
    }
    

    Kann man einfach so in eine Map eine weitere reinstecken?



  • darkfate schrieb:

    Kann man einfach so in eine Map eine weitere reinstecken?

    map1.insert(map2.begin(), map2.end());
    

    Nur scheint dein Problem eher eines zu sein das mit Programmieren an sich nichts zu tun hat sondern eher damit wie die Verschmelzung an sich stattfinden soll.



  • Fellhuhn schrieb:

    darkfate schrieb:

    Kann man einfach so in eine Map eine weitere reinstecken?

    map1.insert(map2.begin(), map2.end());
    

    Nur scheint dein Problem eher eines zu sein das mit Programmieren an sich nichts zu tun hat sondern eher damit wie die Verschmelzung an sich stattfinden soll.

    Dennoch eine gute Idee für das abschließende zusammenfügen.
    Jedenfalls besser als über eine for schleife und interatoren.

    Danke an alle


Log in to reply