Operatorüberladung sowie Optimierung einer Klasse
-
@1: Das scheint so nicht zu funktionieren, jedenfalls frißt der Compiler es nicht
"error C2143: Syntaxfehler : Fehlendes ';' vor '+='" und "error C2580: Neudefinition des Klassennamens 'CTest'" bringt er für Dein Überladevorschlag von +=@2: Dazu muß ich mir mal die Frienddefinition anschauen, das wird aber erst morgen/übermorgen was

-
Du mußt die entsprechenden Opratoren auch innerhalb der Klasse deklarieren
Sonst wundert sich der Compiler später, woher die kommen.
-
Ich hab's im public-Bereich der Klasse deklariert, oder was meinst Du? *nixpeil*
-
UNeverNo schrieb:
Ich hab's im public-Bereich der Klasse deklariert, oder was meinst Du? *nixpeil*
zeig doch am besten nochmal ein kleines stück code (von der deklaration in klasse und definition)
-
Das von CStoll gepostete Format ist für ausserhalb der Klasse gedacht (Definition, von Klassendeklaration getrennt). Dazu kommt ein einfacher Tippfehler: Das Semikolon am Ende des zweiten Funktionskopfes.
Du solltest schleunigst lernen wie man in C++ die Definition von der Deklaration trennt, damit Du demnächst solche Beispiele lesen kannst und nicht über (einfachste) Tippfehler der Helfenden stolperst

-
LordJaxom schrieb:
Du solltest schleunigst lernen wie man in C++ die Definition von der Deklaration trennt, damit Du demnächst solche Beispiele lesen kannst und nicht über (einfachste) Tippfehler der Helfenden stolperst

hier im post hab ich den aber auch übersehen *schäm*
-
LordJaxom schrieb:
Das von CStoll gepostete Format ist für ausserhalb der Klasse gedacht (Definition, von Klassendeklaration getrennt). Dazu kommt ein einfacher Tippfehler: Das Semikolon am Ende des zweiten Funktionskopfes.
Du solltest schleunigst lernen wie man in C++ die Definition von der Deklaration trennt, damit Du demnächst solche Beispiele lesen kannst und nicht über (einfachste) Tippfehler der Helfenden stolperst

Ach, das mit dem Semikolon habe ich schon gesehen.
Deklaration ist z.B.
int foo(void);Definition dann
int foo(void) { return 123; }Wüßte nicht wie mir das weiterhilft...
-
nein, ich meine von deinem operator der nicht funktioniert!
-
Wenn Du das weisst kannst Du mir bestimmt auch sagen wieso diese Information Dir nicht hilft, in folgendem Code einen Fehler zu finden.
CTest CTest::operator+(const CTest& other); { CTest tmp(*this); return tmp+=other; }EDIT: Bzw, dass das nur einer von den zwei Compiler-Fehlern ist war mir übrigens schon klar. Der andere Compilerfehler kommt vermutlich weil Du den Code direkt in die Klasse eingesetzt hast (richtig?)
-
Wie gesagt das Semikolon ist zuviel, aber der Fehler kommt schon beim überladen von += und wie gesagt habe ich es in den public-Bereich der Klasse gepappt.
Wüßte nicht wohin/wie sonst.
Würde sonst nicht hier im Forum posten :D;)
-
Deshalb sagte ich Du sollst die Trennung lernen

class CTest { CTest operator+(const CTest& other) { CTest tmp(*this); return tmp+=other; } };Entweder so (ohne Trennung, ohne Semikolon, ohne CTest::) oder
/* .h File */ class CTest { CTest operator+(const CTest& other); }; /* .cpp File */ CTest CTest::operator+(const CTest& other) { CTest tmp(*this); return tmp+=other; }Wobei die Trennung nicht unbedingt in verschiedene Dateien stattfinden muss, aber das macht i.A. Sinn

-
und ich würde deinen code von der klassendeklaration und der definition des operators trotzdem gern sehen!
Sonst wird das ja ein rätselraten!
-
ser1al schrieb:
und ich würde deinen code von der klassendeklaration und der definition des operators trotzdem gern sehen!
Sonst wird das ja ein rätselraten!
Ich kleiner, unwissender Anfänger hatte das Beispiel 1:1 übernommen, weil mir der Kopf
CTest& CTest::operator+=(const CTest& other)nichts gesagt hatte mit dem doppelten CTest und dann noch die Referenz am Anfang. Praktisch sah es so aus:
class CTest { int wert; public: //Konstruktor, RotR, RotL s. Eingangspost CTest& CTest::operator +=(const CTest& other) { wert=RotL( RotR(wert,x)+RotR(other.wert,x) , x); return this; } }Das alles steht erstmal nur in meiner main.cpp, Headerdatei usw. mache ich erst, wenn der Test erfolgreich läuft

-
UNeverNo schrieb:
ser1al schrieb:
und ich würde deinen code von der klassendeklaration und der definition des operators trotzdem gern sehen!
Sonst wird das ja ein rätselraten!
Ich kleiner, unwissender Anfänger hatte das Beispiel 1:1 übernommen, weil mir der Kopf
CTest& CTest::operator+=(const CTest& other)nichts gesagt hatte mit dem doppelten CTest und dann noch die Referenz am Anfang.
Das erste CTest& ist der Rückgabetyp des Operators (btw, im Nachhinein ist mir noch ein Fehler in der Funktion aufgefallen - das muß natürlich "return *this;" lauten), das zweite CTest:: kennzeichnet die Funktion als Element der Klasse CTest (und das ist unnötig, wenn du die Funktion innerhalb der Klassendeklaration aufzählst).
-
siehst du, es lag an der trennung, worauf dich LordJaxom weiter oben schon hingewiesen hatte

in der classe kannst du das CTest:: weglassen!
das brauchst du aber, wenn du die definition ausserhalb der klasse machst (also deklaration in .h, definition in .cpp)!