Wie kann ich eine Klasse kopieren?



  • Hallo!

    Wie kann ich meine Klasse Knoten kopieren?

    class Knoten {
    
       public:
          bool Ende;
          Knoten &links;
          Knoten &rechts;
          long double Wahrscheinlichkeit;
          unsigned char Zeichen;
    
    };
    
    void KopiereKnoten(Knoten &KQuelle; Knoten &KZiel)
    {
    
       KZiel.Ende = KQuelle.Ende;
       KZiel.links = KQuelle.links;
       KZiel.rechts = KQuelle.rechts;
       KZiel.Wahrscheinlichkeit = KQuelle.Wahrscheinlichkeit;
       KZiel.Zeichen = KQuelle.Zeichen;
    
    }
    

    Fehlermeldung:

    EncHuffman.cpp:12: parse error before ;' token EncHuffman.cpp: In functionvoid KopiereKnoten(...)':
    EncHuffman.cpp:15: KZiel' undeclared (first use this function) EncHuffman.cpp:15: (Each undeclared identifier is reported only once for each function it appears in.) EncHuffman.cpp:15:KQuelle' undeclared (first use this function)

    Was mache ich falsch?

    Viele Grüße
    pmw



  • void KopiereKnoten(Knoten &KQuelle; Knoten &KZiel)
    

    sollte doch

    void KopiereKnoten(Knoten &KQuelle, Knoten &KZiel)
    

    heißen
    Das sagt dir übrigens dieser Error:

    EncHuffman.cpp:12: parse error before `;' token
    


  • Danke 🙂

    Jetzt habe ich leider einen neuen Fehler:

    EncHuffman.cpp: In member function Knoten& Knoten::operator=(const Knoten&)': EncHuffman.cpp:16: non-static reference memberKnoten&Knoten::links', can't
    use default assignment operator
    EncHuffman.cpp:16: non-static reference member `Knoten&Knoten::rechts', can't
    use default assignment operator



  • zeig doch mal den Code dazu 😉



  • void KopiereKnoten(Knoten &KQuelle, Knoten &KZiel)
    {
    
       KZiel.Ende = KQuelle.Ende;
       KZiel.links = KQuelle.links; //Fehler: non-static reference member `Knoten&Knoten::links', can't 
       KZiel.rechts = KQuelle.rechts; //Fehler: non-static reference member `Knoten&Knoten::rechts', can't 
       KZiel.Wahrscheinlichkeit = KQuelle.Wahrscheinlichkeit;
       KZiel.Zeichen = KQuelle.Zeichen;
    
    }
    


  • ma mal aus
    void KopiereKnoten(Knoten &KQuelle; Knoten &KZiel)

    void KopiereKnoten(Knoten &KQuelle, Knoten &KZiel)

    ( aus ; , machen)

    außerdem schau dir mal den copy-konstruktor an



  • Danke für deine Antwort!

    xroads42 schrieb:

    ma mal aus
    void KopiereKnoten(Knoten &KQuelle; Knoten &KZiel)

    void KopiereKnoten(Knoten &KQuelle, Knoten &KZiel)

    ( aus ; , machen)

    Das war klar. Ich hatte es im Quellcode bereits geändert?

    xroads42 schrieb:

    außerdem schau dir mal den copy-konstruktor an

    Was meinst du damit genau?



  • links und rechts sind Referenzen. Da sich das Ziel der Referenzen nachträglich nicht mehr ändern lässt, was im operator= aber passieren müsste, tritt ein Compilerfehler auf.



  • xroads42 meint mit Copy-Konstruktor den Kopierkonstruktor, den du ebenfalls selber schreiben kannst.
    Mit Hilfe diesem kannst du dann wie der Name schon sagt Kopien von deiner Klasse erstellen. Oft reicht aber der Standardkopierkonstruktor aus. (Stichwort: flache Kopie und tiefe Kopie)
    Schlag mal in deinem Lieblings-C++-Buch nach.



  • Hallo!

    Ich habe mit den Stichwörtern "flache tiefe Kopie C++" mit Google danach gesucht. Leider habe ich nichts gefunden, was ich verstanden habe 😞 Weiß vielleicht jemand wie ich die beiden entsprechenden Zeilen ändern muss?

    Viele Grüße
    pmw



  • Hm.. Warum deklarierst du eigentlich 2 Referenzen auf Knoten?
    Welchen Zweck hat dies, was soll "rechts" und "links"?
    Du musst den beiden Referenzen ja noch ein Objekt von Knoten zuweisen.
    Passiert dies im Standardkonstruktor?
    Ich verstehe da den Zusammenhang nicht.
    Du musst den Zuweisungsoperator (=) überladen.

    const Knoten& operator=(const Knoten& knoten)
    {
        // ...
    }
    

    Edit: Mit flache Kopie meine ich, dass du es selber in Hand nehmen musst wie du z.B. 2 Zeiger zuweist.



  • Hallo!

    Ich möchte ein Programm schreiben, dass Dateien nach Huffman komprimiert. Dazu muss ich einen Baum mit mehreren Knoten erzeugen. Eine asuführlich Erklärung des Huffman-Baums findet man unter folgendem Link: http://www-user.tu-chemnitz.de/~mfie/compproj/2common.htm#huffmann.

    "Knoten &links" Hier ist der Verweis auf dne Knoten gespeichert, der links unten anhängt.

    "Knoten &rechts" Hier ist der Verweis auf dne Knoten gespeichert, der rechtsunten anhängt.

    Viele Grüße
    pmw



  • Hast aber immernoch nicht gesagt, wo du die Referenzen auf die Objekte verweist.
    Läuft das in der Klasse ab (also über new, was ich denke) oder über ein lokales Objekt in z.B. main() ab?
    Dies hat natürlich nichts mit deiner Frage zu tun, kann als OT bewertet werden. 🙄
    Wie man eine Referenz auf ein Knoten an eine Refernz auf ein Knoten zuweist weiß ich gerade nicht.
    (mit tempöraren Objekten vom Typ Knoten im Operator arbeiten?)
    Vielleicht kann dir jemand anderes helfen.
    Geh dann mal gleich ins Bett.



  • nimm statt der referenzen einfach Zeiger. kann es sein, dass du von java kommst?



  • Ich weiß jetzt nicht, ob du mich meinst, aber ich komme nicht von Java.
    Ok. Zeiger wären eine Möglichkeit, aber ich dachte, er wolle nur Referenzen benutzen. 😃
    Na dann..



  • Nein, ich habe vorher Delphi gemacht.

    Mit Zeigern klappt es. Ich hatte in diversen C++Tutorials gelesen, man soll Referenzen und keine Zeiger verwenden 😞 Mit den Zeigern bekomme ich jetzt keine Fehlermeldung mehr 🙂



  • Man soll Referenzen nur solange verwenden, wie es geht. Da man Referenzen nicht neu setzen kann, gehen sie hier eben nicht. Und wenn du Zeiger verwendest, musst du weder ein KopiereKnoten, noch einen operator= schreiben, weil C++ für dich automatisch einen korrekten Zuweisungsoperator bereitstellt.



  • Noch eine Frage: Wie mache ich eine Array aus Zeigern? Folgendes geht nicht 😞 Ich habe mich hieran orientiert: http://www.volkard.de/vcppkold/zeiger.html

    Knoten AKnotenListe[100];  // Array of 100 Knoten
    Knoten (*AZeigerListe)[100];  //Array of 100 Zeigern
    
    for (unsigned short i=0; i<100; ++i)
    {
    
    *(AZeigerListe[i]) = &(AKnotenListe[i]); // <-- Fehler
    
    }
    


  • Die Zeiger in deiner ZeigerListe sind nicht initialisiert und haben keinen Speicher zugewiesen. Wenn du sie dereferenzierst schreibst du irgendwo in den Speicher -> BOOM! Lass einfach mal die Dereferenzierung (*) weg.



  • Die AKnotenListe ist in allen 100 Einträgen gefüllt. Ich habe den Code hier nur weggelassen, da er ca. 2 Seien lang ist und es so unübersichtlich wäre, bzw. vom eigendlich Problem ablenken würde.

    Geht leider auch nicht:

    ABaum[i] = &(AKnotenListe[i]);
    

    incompatible types in assignment of `Knoten*' to `Knoten[(((IAnzahlZeichen * 2) - 2) + 1)]'


Anmelden zum Antworten