Operatoren überladen?
-
Hallo Leute.
OS: QNX Momentics 6.3.2
ANSI und POSIXIch habe ein Problem beim Versuch Operatoren zu überladen:
[cpp]struct socket_properties { char cIPAddress[16]; char cPort[6]; bool bShouldConnect; int nTyp; void operator= (const struct socket_properties &pObject) { strcpy(cIPAddress, pObject.cIPAddress); strcpy(cport, pObject.cPort); bShouldConnect = pObject.bShouldConnect; nTyp = pObject.nTyp; } } socket_properties; [/cpp]
Ich bekomme in meiner Umgebung immer folgenden Fehler gemeldet:
parse error before '='
Kann es sein, dass er "operator" nicht kennt oder macht man das in C ganz anders?
Gruß, Sven
-
Der Compiler sagt doch, was ihm nicht gefällt. Die linke Seite der Zuweisung ist wohl nicht deklariert.
-
Sowas gibt's in C nicht! In C können struct's nur Daten enthalten, keine Methoden. Dementsprechend gibt's auch keine Operatorüberladung.
-
Belli schrieb:
Sowas gibt's in C nicht! In C können struct's nur Daten enthalten, keine Methoden. Dementsprechend gibt's auch keine Operatorüberladung.
Ach, und welchen Weg muss ich gehen, wenn ich = oder auch == verwenden will?
Muss ich dann alles von Hand machen?
Gibt es da keine andere Möglichkeit?Gruß, Sven
-
Belli schrieb:
Sowas gibt's in C nicht! In C können struct's nur Daten enthalten, keine Methoden. Dementsprechend gibt's auch keine Operatorüberladung.
Schon richtig, aber Pointer auf Funktionen sind auch nur Daten, die kann man jederzeit ändern. Annäherung von der anderen Ecke her, geht aber auch.
-
Wollt ihr ANSI-C dazu zwingen, was nach C++ gehört? Könnt ihr machen, doch das haben andere schon getan!
-
(const struct socket_properties &pObject)
In C gibt es übrigens auch keine Referenzen...
So wie dein Code aussieht, nimm doch lieber C++
-
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.