Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

03.06.2008, 15:26

Zitat

Deine erste Version war von der Funktionalität her schon richtig. Der Zuweisungsoperator soll ja etwas zuweisen. Wenn du einfach dein Objekt durchreichts hast du zum einen keine Kopie erzeugt, zum anderen gibst du ein nicht erwartetes Objekt zurück.


Jetzt bin ich total verwirrt.... :?

So, hab mal das ganze mit VC++ 6.0 kompilliert:

Zitat

d:\projects\main.cpp(60) : error C2801: 'operator =' must be a <Unknown> member
d:\projects\main.cpp\main.cpp(61) : error C2065: 'x' : undeclared identifier
d:\projects\main.cpp\main.cpp(61) : warning C4244: '=' : conversion from 'const float' to 'int', possible loss of data
d:\projects\main.cpp\main.cpp(62) : error C2065: 'y' : undeclared identifier
d:\projects\main.cpp\main.cpp(62) : warning C4244: '=' : conversion from 'const float' to 'int', possible loss of data
d:\projects\main.cpp\main.cpp(63) : error C2065: 'z' : undeclared identifier
d:\projects\main.cpp\main.cpp(63) : warning C4244: '=' : conversion from 'const float' to 'int', possible loss of data
d:\projects\main.cpp\main.cpp(64) : error C2673: '=' : global functions do not have 'this' pointers
d:\projects\main.cpp\main.cpp(69) : error C2805: binary 'operator +=' has too few parameters
d:\projects\main.cpp\main.cpp(70) : warning C4244: '+=' : conversion from 'const float' to 'int', possible loss of data
d:\projects\main.cpp\main.cpp(71) : warning C4244: '+=' : conversion from 'const float' to 'int', possible loss of data
d:\projects\main.cpp\main.cpp(72) : warning C4244: '+=' : conversion from 'const float' to 'int', possible loss of data
d:\projects\main.cpp\main.cpp(73) : error C2673: '+=' : global functions do not have 'this' pointers


Liegt (wie ich eigentlich erwartet habe) nicht an VC++ 2008. Aber ist in dieem Fall das Listing falsch (Listing 2.6)? Oder wo liegt der Fehler? Bin irgendwie in einer gedanklichen Sackgasse!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

12

03.06.2008, 15:27

Sie sieht denn der aktuelle Code aus?
@D13_Dreinig

13

03.06.2008, 15:30

Siehe mein 2.Post, hab einfach noch ein die main-Funktion (die nichts tut) angehängt damit es auch kompillieren könnte.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

03.06.2008, 16:00

Nadann, siehe meinen 1. Beitrag.
@D13_Dreinig

15

03.06.2008, 16:06

Ou, da hab ich wohl vor lauter Code die Lösung nicht gesehen! Vielen Dank hat funktioniert! :D

Nur mal so ne Verständniss-Frage: Wieso wird der "="- und der "!="-Operator anders behandelt als "+","-" usw. ? Gibt es da dafür einen speziellen Grund?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

16

03.06.2008, 16:08

Zitat von »"Melechesh"«

Ou, da hab ich wohl vor lauter Code die Lösung nicht gesehen! Vielen Dank hat funktioniert! :D

Nur mal so ne Verständniss-Frage: Wieso wird der "="- und der "!="-Operator anders behandelt als "+","-" usw. ? Gibt es da dafür einen speziellen Grund?


Inwiefern werden die Operatoren denn anders behandelt?
@D13_Dreinig

17

03.06.2008, 16:21

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class tdeVector3f
{
public: float x,y,z;
//...


tdeVector3f& operator=( const tdeVector3f& a ); //<-

tdeVector3f& operator+=( const tdeVector3f& a ); //<-

};


Hier muss der =-Operator definiert werden, dass ist bspw. beim +-Operator nicht der Fall.

Das ganze führt dann ja auch zum folgenden Unterschied:

C-/C++-Quelltext

1
2
inline tdeVector3f operator + (const tdeVector3f& a, const tdeVector3f& b)
{


C-/C++-Quelltext

1
inline tdeVector3f& tdeVector3f::operator = (const tdeVector3f& a)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

18

03.06.2008, 16:25

Du kannst auch die Funktion operator+ als Methode von tdeVector3f deklarieren. Du verwendest hier eben die globale Variante, beides kein Problem:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
class tdeVector3f
{
public:
    tdeVector3f operator+( const tdeVector3f& a ) const;
}

tdeVector3f tdeVector3f::operator+( const tdeVector3f& a ) const
{
    return tdeVector3f( x+a.x, y+a.y, z+a.z );
}


Eine Ausnahme ist der operator=. Dieser sollte immer als Methode der jeweiligen Klasse deklariert sein.
@D13_Dreinig

19

03.06.2008, 16:29

Ach so. :)

Nochmal vielen dank für die Hilfe!

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

20

03.06.2008, 17:39

Zitat von »"David_pb"«


Eine Ausnahme ist der operator=. Dieser sollte immer als Methode der jeweiligen Klasse deklariert sein.

Hmm... ich würde da schon noch die ganzen anderen Zuweisungsoperatoren dazu nehmen (+=, -=, ...)


@Melechesh
Die Trennlinie, ob der operator in die Klasse kommt oder extern implementiert wird ist meist, ob das Objekt was links steht selbst verändert wird (=, +=, ...) oder ob aus den Werten ein neues Ergebnis kreiert wird ohne die übergebenen Objekte zu verändern (+, -, ..., ==, !=, ...).

Ob du das so übernimmst oder bei deinem Code anders machst musst du halt selbst wissen^^

Werbeanzeige