Problem mit operator
-
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?
-
CStoll schrieb:
und "a=b;" ist syntaktisch auch nichts anderes als "a+b;" - also warum zählst du = nicht als binären Operator?
weil es schwachsinnig ist! was soll ich mit a + b alleine? mit temporären objekten auf dem stack um mich schmeißen? also zähle ich den op= dazu, bezeichne das konstrukt aber immer noch als binären operator.
und so mache ich es auch beim op= . ich könnte einfach
value;
in den code schreiben. bringt aber nichts, also zähle ich den op= einfach dazu => unärer operator.
-
terraner schrieb:
weil es schwachsinnig ist! was soll ich mit a + b alleine? mit temporären objekten auf dem stack um mich schmeißen?
Darum geht es nicht. Ein unäre Operator hat einen Operanden, ein binärer hat zwei. Ob das semantisch sinnvoll ist, interessiert da nicht, es geht rein um die Syntax. Du kannst eben weder
a=;
noch
=a;
schreiben, weil das syntaktisch falsch ist. = braucht zwei Operanden, einen links und einen rechts. Darum ist = ein binärer Operator, fertig. Welche Semantik dahinter steckt, ist völlig wurscht. Was ist, wenn ich op= so überlade, dass es das gleiche macht wie op+? Wird der Operator dann nach deiner Logik plötzlich binär?
-
MFK schrieb:
Wird der Operator dann nach deiner Logik plötzlich binär?
rein logisch gesehen: ja :p
ich hab jetzt gemerkt, dass ich da syntax und semantik vermischt habe.