Operatoren überladen?
-
Fiesek schrieb:
Ach, und welchen Weg muss ich gehen, wenn ich = oder auch == verwenden will?
mit funktionen, z.b: compare (obj *a, obj *b); oder so ähnlich.
Fiesek schrieb:
Muss ich dann alles von Hand machen?
überladene op's musste doch auch von hand schreiben, genau so, wie die funktionen, die das in C übernehmen.
Ravendark schrieb:
nimm doch lieber C++
quatsch!
-
Hihi, ist das denn so auffällig, das ich schon ewig nicht mehr ANSI-C programmiert habe?
Aber das es in C keine Referenzen geben soll ist mir jetze irgendwie neu.
Aber wie müsst ich das denn jetzt anfassen, wenn ich = oder auch == oder ... überladen will in C?
Irgendwie bin ich da grad ein wenig planlos.
-
Fiesek schrieb:
Aber wie müsst ich das denn jetzt anfassen, wenn ich = oder auch == oder ... überladen will in C?
In C gibt's gar keine Überladung. Weder für Operatoren noch für Funktionen.
-
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?
Ein einfaches Struc1 = Struc2 funzt dann nicht?!?
-
Fiesek schrieb:
Ein einfaches Struc1 = Struc2 funzt dann nicht?!?
doch, das funzt. ist gewissermassen 'ne fest eingebaute 'überladung 'für structs.
struct test a = {...}; struct test c = {...}; struct test b; b = a; // b wird zur kopie von a b = c; // b wird zur kopie von c
-
Ok, danke schön.
-
Das Problem dabei ist, das auch von Zeigern nur Zeigerkopien angelegt werden, nicht aber der Speicherbereich, auf den gezeigt wird, kopiert wird.
Sollte also zB in einer struct-Variablen ein char-Zeiger auf einen String zeigen, so zeigen nach einer Zuweisung der struct-Variablen an eine andere die char-Zeiger in beiden Variablen auf denselben Speicherbereich.
Eine tiefe Kopie erfordert also mehr Aufwand, und genau dafür benutzt man in C++ die Überladung des Zuweisungsoperators.
-
MFK schrieb:
In C gibt's gar keine Überladung. Weder für Operatoren noch für Funktionen.
So ist es! Ist deutlicher gesagt als mein vorheriger Beitrag.
-
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.