Wie kann ich eine Klasse kopieren?



  • 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