Problem mit operator
-
Hi!
Ich hab folgendes Problem:
Ich habe eine structur fuer einen Wegpunkt in einem 3D Spiel gemacht.
Diese sieht so aus:struct sWaypoint { XMatrix point; XMatrix lookAt; bool arrived; float movingSpeed; };Danach habe ich einen Zuweisungs Operator definiert:
void operator = (sWaypoint& w1, sWaypoint& w2) { // Hier finden die einzelnen zuweisungen statt... }Nun meldet mir aber den Compiler einen fehler: "operator = must be a <Unknown> member".
Was mache ich falsch?
mfg LastManStanding
-
Der Zuweisungsoperator kann nicht frei stehen. Er muss ein Member deiner Klasse / deines Structs sein. Das erste Argument ist damit implizit das Objekt, von dem er aufgerufen wurde.
-
Wenn du da sowieso nur die Member der Reihe nach zuweist, kannst du dir das auch sparen. Das macht der op=, den der Compiler automatisch generiert, auch.
-
Das steht irgendwo im Standard (und wird auch von deiner Meldung so erklärt): Der Zuweisungsoperator MUSS Memberfunktion der zugewiesenen Klasse sein:
struct sWayPoint { //... sWayPoint& operator=(const sWayPoint& other) { //... (denk an Schutz vor Selbstzuweisung ;) } }
-
Ah! Danke! Es geht jetzt!
Nein ich brauch den operator, da ich sonst lauter fehler bekomme wenn ich einen vector draus machen will!
mfg LastManStanding
-
LastManStanding schrieb:
Nein ich brauch den operator, da ich sonst lauter fehler bekomme wenn ich einen vector draus machen will!
Verrat uns doch mal einen davon.
-
// das präfix kann weg struct sWaypoint // klassennamen werden meist groß geschrieben { XMatrix point; XMatrix lookAt; bool arrived; float movingSpeed; sWaypoint& operator= (const sWaypoint& rhs); // op= muss member sein }; sWaypoint& sWaypoint::operator= (const sWaypoint& rhs) { ... return *this; }*nicht kompiliert*
edit: zu langsam, wurde alles schon gesagt
-
terraner schrieb:
// alle unären operatoren müssen member seinWas will er uns damit sagen? Afaik ist operator=() der einzige, der als Member implementiert sein MUSS.
-
CStoll schrieb:
Was will er uns damit sagen?
Keine Ahnung. Unär ist der op= auch nicht.
-
CStoll schrieb:
denk an Schutz vor Selbstzuweisung

http://www.c-plusplus.net/forum/viewtopic-var-p-is-889410.html#889410
-
CStoll schrieb:
Was will er uns damit sagen? Afaik ist operator=() der einzige, der als Member implementiert sein MUSS.
"sollten"

MFK schrieb:
Unär ist der op= auch nicht.
sondern? zu den binären ops würde ich ihn jedenfalls auch nicht dazuzählen.
-
terraner schrieb:
MFK schrieb:
Unär ist der op= auch nicht.
sondern? zu den binären ops würde ich ihn jedenfalls auch nicht dazuzählen.
Doch, der ist ein binärer Operator, weil er zwei Operanden benötigt (unäre Operatoren sind z.B. * (Pointer), & (Adresse) oder ++ (Inkrement)).
Edit: Und du hattest nicht "sollten", sondern "müssen" geschrieben

-
CStoll schrieb:
Doch, der ist ein binärer Operator, weil er zwei Operanden benötigt (unäre Operatoren sind z.B. * (Pointer), & (Adresse) oder ++ (Inkrement)).
a = b + c; // binär a = b; // hm... //&a; // unär, bringt aber nichts, weil der return-value sowieso verloren geht, also: p = &b; // unär // -> op= ist unär
-
terraner schrieb:
a = b; // hm...
Wieso hm...? Wieviele Operanden siehst du hier?
p = &b; // unär
Hier sind zwei Operatoren. Ein unäres & und ein binäres =.
// -> op= ist unär
Ich kann beim besten Willen nicht erkennen, wie du darauf kommst. Zähl doch einfach die Operanden.
-
ja, ich sehe immer zwei, aber dabei würde jedesmal der operator= rausfallen.
*tmp* = a + b;
c = *tmp*;a + b würde ja schon genügen, allerdings ist das nicht logisch, schwachsinnig. es bekommt doch erst durch den zuweisungsoperator einen sinn, weshalb ich das objekt, dass den op= aufruft als "passiv" ansehe und nicht mitzähle.
btw:
Objektorientierte Programmierung für Dummies schrieb:
Die Zuweisungsoperatoren sind aber streng genommen weder binäre nich unäre operatoren, sondern eine Art Mischding.
-
terraner schrieb:
Objektorientierte Programmierung für Dummies schrieb:
Die Zuweisungsoperatoren sind aber streng genommen weder binäre nich unäre operatoren, sondern eine Art Mischding.
Streng genommen - und überhaupt - ist das völliger Blödsinn.
-
Ok das naechste Problem ist da!
den Code von der zuweisung der waypoint structur kennt ihr ja bereits.
Um diesen zum laufen zu bringen, habe ich in meiner Matrix Klasse den Operator:void XMatrix::operator =(const XMatrix& mat) { this->m_Mat = mat.getMatrix(); }m_Mat ist eine Direct3D Matrix struktur, und getMatrix sieht so aus:
inline D3DXMATRIX& getMatrix() { return m_Mat; }Nun erhalte ich folgenden Fehler:
error: "getMatrix()", cannot convert "this" pointer from "const class XMatrix" to "class XMatrix&"Woran liegt das?
mfg LastManStanding
-
Du hast deine GetMatrix-Funktion als nicht-const deklariert, damit kannst du sie nicht auf das (konstante) other anwenden. Aber wieso schreibst du nicht einfach "this->m_Mat=other.m_Mat;"?
@terraner: Ein n-ärer Operator hat n Operanden (bei globalen Funktionen sind das n Parameter, bei Member-Funktionen this und n-1 Parameter) und liefert einen Rückgabewert. Und deine Beispiele waren zusammengesetzt aus mehreren Operatoren:
a + b; //binär (auch wenn's so nutzlos ist) a = b; //binär &a; //unär a?b:c; //tertiär
-
Fand das sieht schoener aus. Aber danke fuer den Tipp, mit dem konstanten funktioniert es endlich!
mfg LastManStanding
-
CStoll schrieb:
@terraner: Ein n-ärer Operator hat n Operanden (bei globalen Funktionen sind das n Parameter, bei Member-Funktionen this und n-1 Parameter) und liefert einen Rückgabewert. Und deine Beispiele waren zusammengesetzt aus mehreren Operatoren:
habe ich implizit gesagt: ich habe gesagt, dass es ein binärer op ist, und "a + b würde ja schon genügen".
-
und "a=b;" ist syntaktisch auch nichts anderes als "a+b;" - also warum zählst du = nicht als binären Operator?