Operatoren überladen?
-
Eine tiefe Kopie erfordert also mehr Aufwand, und genau dafür benutzt man in C++ die Überladung des Zuweisungsoperators.
Und das geht automagically?
-
bgdnoy schrieb:
Eine tiefe Kopie erfordert also mehr Aufwand, und genau dafür benutzt man in C++ die Überladung des Zuweisungsoperators.
Und das geht automagically?
was meinst du damit?
-
bgdnoy schrieb:
Eine tiefe Kopie erfordert also mehr Aufwand, und genau dafür benutzt man in C++ die Überladung des Zuweisungsoperators.
Und das geht automagically?
Nö.
-
supertux schrieb:
bgdnoy schrieb:
Eine tiefe Kopie erfordert also mehr Aufwand, und genau dafür benutzt man in C++ die Überladung des Zuweisungsoperators.
Und das geht automagically?
was meinst du damit?
er meint wohl, dass sowas nicht unproblematisch ist, ja total schwierig werden kann.
-
+fricky schrieb:
er meint wohl, dass sowas nicht unproblematisch ist, ja total schwierig werden kann.
Genau.
Außerdem war ich mir nicht sicher, ob bei einem so unscheinbaren '=' in C++ irgendeine Magie dahintersteckt, die entscheidet, was selbst kopiert wird und wovon nur ein Zeiger kopiert wird.
Irgendsoeine Magie gibt es sicher, aber ich hab nicht viel Ahnung von C++...
Ich hab mir halt gedacht, dass sich der Post von Belli ein wenig so anhört, als müsste man in C++ über sowas nicht nachdenken.Fiesek schrieb:
Und wenn ich jetzt den Inhalt der einen in die andere Struktur kopieren will, dann muss ich das Inhalt für Inhalt selber abarbeiten, richtig?
Aber nein! Um beliebige Dinge zu kopieren, kann man immer man: memcpy verwenden.
-
[quote="bgdnoy"]
+fricky schrieb:
Irgendsoeine Magie gibt es sicher, aber ich hab nicht viel Ahnung von C++...
Ich hab mir halt gedacht, dass sich der Post von Belli ein wenig so anhört, als müsste man in C++ über sowas nicht nachdenken.Neeeeeee ... wenn man nix macht, also wenn man den Zuweisungsoperator nicht überlädt, passiert das gleiche wie in C, man erstellt eine flache Kopie, in der evtl. vorhandene Zeiger auf denselben Speicherbereich zeigen, wie im Original - das ist schlecht und kann fatale Fehler nach sich ziehen.
Wenn man also Zeiger in einer Klasse hat, ist es immer eine gute Idee, eine tiefe Kopie zu erstellen, und dazu überlädt man den Zuweisungsoperator, d.h. man erstellt eine entsprechende Methode, die alles notwendige macht, benötigte Speichergröße ermitteln, Speicher allokieren, Inhalt kopieren, etc.Mit dem erhöhten Aufwand meinte ich durchaus Programmieraufwand, nicht etwas Aufwand, den einem die Sprache abnimmt.
-
bgdnoy schrieb:
Aber nein! Um beliebige Dinge zu kopieren, kann man immer man: memcpy verwenden.
Jein, wenn Du einfach eine struct-Variable auf diese Weise kopierst, und diese einen Zeiger auf einen Speicherbereich enthält, dann ergibt sich erst mal genau dieselbe problematische Situation, daß sowohl das Original als auch die Kopie auf denselben Speicher zeigen. Verändert man dann den Inhalt dieses Speicherbereichs, wirkt sich das auf Original UND Kopie aus, gibt man den Speicher frei, weil man zB die Original-Variable nicht mehr benötigt, dann zeigt der Zeiger in der erstellten Kopie auf nicht reservierten Speicher ...
-
Belli schrieb:
Jein, wenn Du einfach eine struct-Variable auf diese Weise kopierst, und diese einen Zeiger auf einen Speicherbereich enthält, dann ergibt sich erst mal genau dieselbe problematische Situation, daß sowohl das Original als auch die Kopie auf denselben Speicher zeigen. Verändert man dann den Inhalt dieses Speicherbereichs, wirkt sich das auf Original UND Kopie aus...
kommt drauf an was man machen will. manchmal soll es so sein, dass pointer von original und kopie auf dasselbe objekt zeigen. ich würde übrigens, in einer programmiersprache, die op-überladungen zulässt, für 'ne 'deep copy' lieber kein unscheinbares '=' verwenden, sondern besser eine funktion mit 'nem sprechenden namen.
-
Du meinst dann eher eine "DeepCopyFunc(void* pParam)"?
-
^^ so ähnlich, wobei ich das 'Func' wohhl weglassen und auch keinen void* nehmen würde.
-
War ja och nur als Beispiel gedacht.
Aber warum denn kein void*?
-
Fiesek schrieb:
Aber warum denn kein void*?
na, weil ein 'deep copy' doch meistens für'n konkreten typ gilt und sehr speziell ist. für andere structs brauchste 'ne andere deep-copy funktion.
-
*sichandieStirnhau*
Na klar, ich war grad gedanklich auf einem anderen Weg.
-
Fiesek schrieb:
Du meinst dann eher eine "DeepCopyFunc(void* pParam)"?
+fricky schrieb:
na, weil ein 'deep copy' doch meistens für'n konkreten typ gilt und sehr speziell ist. für andere structs brauchste 'ne andere deep-copy funktion.
Je nu, why denn not so?
DeepCopy(void *pParam, size_t size)
Dann klappt's auch mittem void
-
pointercrash() schrieb:
Je nu, why denn not so?
DeepCopy(void *pParam, size_t size)
Dann klappt's auch mittem void
Aber wohl kaum mit einer tiefen Kopie ... woher soll ich denn nun wissen, WO in der zu kopierenden Struktur sich der/die Zeiger befindet/n, der auf einen zu kopierenden Speicherbereich zeigt, für den ich Speicher anfordern und den ich dann kopieren muß?
-
pointercrash() schrieb:
Je nu, why denn not so?
DeepCopy(void *pParam, size_t size)
Dann klappt's auch mittem void
C hat leider kein 'instanceof' oder sowas.
-
Belli schrieb:
Aber wohl kaum mit einer tiefen Kopie ... woher soll ich denn nun wissen, WO in der zu kopierenden Struktur sich der/die Zeiger befindet/n, der auf einen zu kopierenden Speicherbereich zeigt, für den ich Speicher anfordern und den ich dann kopieren muß?
Das Beispiel ist ohnehin nur ein Abriß und funktioniert natürlich so nicht, aber man kann es zum Funktionieren bringen, wenn z.B. die Struct einen einheitlichen Headerteil hat.
Meine ganzen Eventqueues und Systick- Slots sind z.B. so aufgebaut. Mit demselben Prinzip läßt sich eine DeepCopy auch realisieren.
-
Wenn man so ein einheitliches Layout nicht hat, muss man halt für jede Struktur eine eigene DeepCopy-Funktion haben. Genauso wie in C++, sie müssen nur alle unterschiedlich heißen.
-
Bashar schrieb:
Wenn man so ein einheitliches Layout nicht hat, muss man halt für jede Struktur eine eigene DeepCopy-Funktion haben. Genauso wie in C++, sie müssen nur alle unterschiedlich heißen.
Ja, ist aber total unschön. Da ich selten DeepCopy brauche, mach' ich das aber tatsächlich noch per Hand.
Aber statt HandleEvent(union events) aufzurufen, sich mit einem Sack voll auszuparsenden Namen rumzuschlagen, tu' ich mir nicht mehr an.
Der Preis dafür sind Speicherverschnitt (die Structs in der union events sind unterschiedlich lang) und ein bißchen Laufzeitverlust.
Also alles kein Drama, die Faulheit siegt.
-
pointercrash() schrieb:
Belli schrieb:
Aber wohl kaum mit einer tiefen Kopie ... woher soll ich denn nun wissen, WO in der zu kopierenden Struktur sich der/die Zeiger befindet/n, der auf einen zu kopierenden Speicherbereich zeigt, für den ich Speicher anfordern und den ich dann kopieren muß?
Das Beispiel ist ohnehin nur ein Abriß und funktioniert natürlich so nicht, aber man kann es zum Funktionieren bringen, wenn z.B. die Struct einen einheitlichen Headerteil hat.
Meine ganzen Eventqueues und Systick- Slots sind z.B. so aufgebaut. Mit demselben Prinzip läßt sich eine DeepCopy auch realisieren.Das setzt aber voraus, daß alle für die tiefe Kopie relevanten Zeiger in dem einheitlichen Headerteil sind.
Es mag ja durchaus sein, daß es im Einzelfall solche Systeme gibt, aber so als allgemein zu empfehlende Vorgehensweise ist die (void- Variante imho nicht geeignet.