Didii Geschrieben 22. April 2004 Geschrieben 22. April 2004 Hallo, kann mir bitte jemand "theoretisch" den Unterschied zwischen Tiefer und Flacher Kopie erläutern. Ich brauch gar kein konkretes Bsp. sondern nur ned Erklärung falls so was bei der Prüfung (FI/AE) dran kommen würde. ich hoffe auf eine leicht verständliche u. nachvollziehbare Antwort cu didii Zitieren
Guybrush Threepwood Geschrieben 22. April 2004 Geschrieben 22. April 2004 In welchem Zusammenhang denn? Ich kann damit nämlich überhaupt nichts anfangen:confused: Zitieren
Didii Geschrieben 22. April 2004 Autor Geschrieben 22. April 2004 im Zusammenhang mit Objekten bei der objektorientierten Programmierung mit Visual C++ Zitieren
Diablo999 Geschrieben 22. April 2004 Geschrieben 22. April 2004 Also, es gibt ja zu jeder Klasse einen CopyKonstruktor, der wird aufgerufen wenn du z.B. ein Objekt einem anderen zuweist: class Klasse1 { private: int Member1; char* Member 2; .... } int main() { Klasse1 o1(1000, "Teststring"); Klasse1 o2(o1); // Hier wird der Copykonstruktor des Objektes o2 aufgerufen } Der Standardmäsige Copykonstruktor macht nichts anderes als alle members von dem einen in das andere Objekt zu übernehmen. Angnenommen der Konstruktor von Klasse1 füllt die Variable Member1 mit der übergebenen Zahl und allociert Speicher für den übergebenen String und sichert den Pointer in Member2 dann kopiert der Standard Copykonstruktor die Inhalte der Variablen Member1 und member2 in o2. Jedoch zeigen jetzt die beiden Pointer, also in o1 und o2 auf den gelcihen String. Wenn du allerdings Objekte als Members der Klasse definiert hast wird rekursiv natürlich deren CopyKonstruktor aufgerufen :-) ==> Dieser Verfahren nennt man Flat Copy Soll jetzt aber der String auch mitkopiert werden muss man sich selbst nen Copykonstruktor schreiben der eben Speicher allociert und den String aus o1 kopiert. ==> Dieses Verfahren nennt man Deep Copy Hoffe das ist einigermaßen Verständlich Gruß Diablo999 PS: Das wär doch was fürs FAQ??? Zitieren
FinalFantasy Geschrieben 30. April 2004 Geschrieben 30. April 2004 #include <stdio.h> void main() { int* a1 = new int[5]; //Array 1 int* a2; //Array 2 for(int i = 0; i < 5; i++) a1[i] = i; // 0-5 in Array 1 schreiben a2 = a1; //flache Kopie for(i = 0; i < 5; i++) a1[i] = 0; //Alle Positionen in Array 1 auf 0 setzen for(i = 0; i < 5; i++) printf("%d ", a2[i]); //Ausgeben der Positionen von Array 2 printf("\n"); //man sieht, die Änderungen in Array 1 wirken sich auf Array 2 aus, weil eigentlich nur ein Array //im Speicher existiert, und a1 und a2 nur auf den gleichen Speicherverweisen for(i = 0; i < 5; i++) a1[i] = i; // 0-5 in Array 1 schreiben //Tiefe kopie: //Man muss sich selber erstmal Speicher anlegen: a2 = new int[5]; for(i = 0; i < 5; i++) a2[i] = a1[i]; //jede einzelne Zahl aus dem Array 1 in Array 2 kopieren for(i = 0; i < 5; i++) a1[i] = 0; //Alle Positionen in Array 1 auf 0 setzen for(i = 0; i < 5; i++) printf("%d ", a2[i]); //Ausgeben der Positionen von Array 2 //Man sieht: Die Änderungen an Array 1 wirken sich so nichtmehr auf Array 2 aus, // weil jedes Array jetzt seinen eigenen Speicher mit eigenem Inhalt hat. delete[] a1; delete[] a2; }[/PHP] Ich find das Beispiel einfacher. Bei höherer Schachteltiefe von Pointern wird das Kopieren natürlich komplizierter. Gewissermaßen ist eine "flache Kopie" gar keine Kopie, sondern eigentlich nur eine Zuweisung von einer Adresse an eine Variable... Zitieren
Diablo999 Geschrieben 30. April 2004 Geschrieben 30. April 2004 Jo, ist auf jeden fall verständlich, aber war ja nach flache und tiefe Kopie bei der OOP gefragt :floet: :floet: :floet: Gruß Diablo999 Zitieren
FinalFantasy Geschrieben 1. Mai 2004 Geschrieben 1. Mai 2004 Jo, ist auf jeden fall verständlich, aber war ja nach flache und tiefe Kopie bei der OOP gefragt :floet: :floet: :floet: Gruß Diablo999 läuft aber auf das Selbe raus, dass man das bei der OOP halt im Copykonstruktor, bzw jedem Konstruktor dem ein Pointer übergeben wird beachten muss, ist eigentlich nur die logische Weiterführung. Sollte man eigentlich auch beim = operator beachten. Genau deswegen, sollte man eigentlich so etwas eher allgemein, verstehen, dann achtet man auch bei der OOP automatisch darauf. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.