Wie kann ich eine Klasse kopieren?
-
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 ZeigernViele 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(); }