Wie kann ich eine Klasse kopieren?



  • 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)]'



  • Ich müsste nur wissen, was an der folgenden Zeiler falsch ist und wie sie richtig heißen sollte:

    *(AZeigerListe[i]) = &(AKnotenListe[i]);
    

    Knoten AKnotenListe[100] -> Array of 100 Knoten
    Knoten (*AZeigerListe)[100] -> Array of 100 Zeigern

    Viele Grüße
    pmw



  • dEUs schrieb:

    Lass einfach mal die Dereferenzierung (*) weg.



  • Leider geht AZeigerListe[i] = &(AKnotenListe[i]); genaun so wenig 😞



  • Schau dir mal dies an:

    int a[100];
    int* b[100]; // <--
    for (int i = 0; i < 100; i++)
    {
    	a[i] = i;
    	b[i] = new int; // <--
    	*b[i] = a[i];  // <--
    	std::cout << i << ": " << a[i] << " " << *b[i] << "\n";
    }
    

    Das musst du jetzt auf deine Knoten anpassen.



  • Danke für die Antwort. Jetzt laäuft zu mindest dieser Teil. Ich habe aber leider wieder ein Problem:

    struct Knoten
    {
       bool Ende;
       Knoten *links;
       Knoten *rechts;
       long double Wahrscheinlichkeit;
       unsigned char Zeichen;
       unsigned short Laenge;
       bool Code[256];
    };
    
    Knoten AKnotenListe[100];  // Array of 100 Knoten
    Knoten *AZeigerListe[100];  //Array of 100 Zeigern
    
    for (unsigned short i=0; i<IAnzahlZeichen-1; ++i)
    {     
       AKnotenListe[i].Ende = 0;
       AKnotenListe[i].Wahrscheinlichkeit = 0;
       AKnotenListe[i].links = NULL;
       AKnotenListe[i].rechts = NULL;   
    }
    
    for (unsigned short i=0; i<100; ++i)
    {   
       AZeigerListe[i] = new Knoten;
       *AZeigerListe[i] = AKnotenListe[i];
    }
    

    An folgender Stelle stürzt das Programm mit einem written-Error ab:

    (*AZeigerListe[1]).Laenge = (*AZeigerListe[1]).Laenge + 1;
    


  • (*AZeigerListe[1]).Laenge += 1;
    

    Edit: Mache deine Variablen doch private. Dann musst du zuätzlich über eine Methode zugreifen (z.B. set() und get())

    #include <iostream>
    
    class A
    {
    private:
    	int laenge;
    public:
    	A() : laenge(1)
    	{}
    	inline int get() const
    	{
    		return laenge;
    	}
    	inline void set(int i)
    	{
    		laenge += i;
    	}
    };
    
    int main()
    {
    	A a[100];
    	A* b[100];
    	for (int i = 0; i < 100; i++)
    	{
    		b[i] = new A;
    		std::cout << i << ": " << a[i].get() << " " << (*b[i]).get() << "\n";
    	}
    	(*b[1]).set(1);
    	std::cout << (*b[1]).get();
    }
    

Anmelden zum Antworten