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

1

03.06.2008, 14:21

Überladen der Operatoren = und +=

Ich habe folgendes Problem in Kapitel 2 (Vektoren):

Beim kompillieren trten im folgenden Teil des Codes Fehler auf (mit Visual C++ 2008 Express), aber ich bin mir sicher alles richtig abgeschrieben zu haben (der Name der Klasse ist natürlich anders):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Zuweisung eines anderen Vektors

tdeVector3f& operator = (const tdeVector3f& a)
{
    x += a.x;
    y += a.y;
    z += a.z;
    return *this;
}

//Zuweisung und addition eines anderen Vektors

tdeVector3f& operator += (const tdeVector3f& a)
{
    x += a.x;
    y += a.y;
    z += a.z;
    return *this;
}


Folgende Fehler werden ausgegeben:

Zitat

d:\projects\vector3d.cpp(52) : error C2801: "operator =" muss ein nicht statischer Member sein.
d:\projects\vector3d.cpp(53) : error C2065: 'x': nichtdeklarierter Bezeichner
d:\projects\vector3d.cpp(54) : error C2065: 'y': nichtdeklarierter Bezeichner
d:\projects\vector3d.cpp(55) : error C2065: 'z': nichtdeklarierter Bezeichner
dd:\projects\vector3d.cpp(56) : error C2673: 'operator =': Globale Funktionen haben keinen this-Zeiger
d:\projects\vector3d.cpp(61) : error C2805: Binärer Operator '+=' hat zu wenig Parameter
d:\projects\vector3d.cpp(62) : error C2065: 'x': nichtdeklarierter Bezeichner
d:\projects\vector3d.cpp(63) : error C2065: 'y': nichtdeklarierter Bezeichner
d:\projects\vector3d.cpp(64) : error C2065: 'z': nichtdeklarierter Bezeichner
d:\projects\vector3d.cpp(65) : error C2673: 'operator +=': Globale Funktionen haben keinen this-Zeiger



Ich verstehe die fehler nicht ganz, könnte es mit VC++ 2009 zusammenhängen? Wie kann ich diese Fehler beheben?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

03.06.2008, 14:26

Zeig mal die gesamte Deklaration der Klasse.

btw.
Solltest du dir nochmal überlegen, ob der Rückgabewert (und der Code) bei = wirklich das ist, was du willst..

3

03.06.2008, 14:32

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
class tdeVector3f
{
public: float x,y,z; 

tdeVector3f() {} // Konstruktor (tut nichts)

tdeVector3f(const tdeVector3f& v) : x(v.x), y(v.y), z(v.z) {} //Kopierkonstruktor

tdeVector3f(const float vx,const float vy, const float vz) : x(vx), y(vy), z(vz) {} // Konstruktor der die eingegebenen Zahlen einsetzt

};


// OPERATOREN


//Addition zweier Vektoren

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

//Subtraktion zweier Vektoren

inline tdeVector3f operator - (const tdeVector3f& a, const tdeVector3f& b)
{
return tdeVector3f(a.x - b.x, a.y - b.y, a.z - b.z);
}

//Multiplikation zweier Vektoren

inline tdeVector3f operator * (const tdeVector3f& a, const tdeVector3f& b)
{
return tdeVector3f(a.x * b.x, a.y * b.y, a.z * b.z);
}

//Division zweier Vektoren

inline tdeVector3f operator / (const tdeVector3f& a, const tdeVector3f& b)
{
return tdeVector3f(a.x / b.x, a.y / b.y, a.z / b.z);
}

//Multiplikation mit einem Skalar (float)

inline tdeVector3f operator * (const tdeVector3f& a, const float f)
{
return tdeVector3f(a.x * f, a.y * f, a.z * f);
}

//Multiplikation mit einem Skalar (float) vertauscht

inline tdeVector3f operator * (const float f, const tdeVector3f& a)
{
return tdeVector3f(a.x * f, a.y * f, a.z * f);
}


//Division durch einen Skalar (float)

inline tdeVector3f operator / (const tdeVector3f& a, const float f)
{
return tdeVector3f(a.x / f, a.y / f, a.z / f);
}

//Zuweisungsoperatoren


//Zuweisung eines anderen Vektors

tdeVector3f& operator = (const tdeVector3f& a)
{
    x = a.x;
    y = a.y;
    z = a.z;
    return *this;
}

//Zuweisung und addition eines anderen Vektors

tdeVector3f& operator += (const tdeVector3f& a)
{
    x += a.x;
    y += a.y;
    z += a.z;
    return *this;
}

//Vergleichsoperatoren


bool operator == (tdeVector3f& a, tdeVector3f& b)
{
    return a.x == b.x && a.y == b.y && a.z == b.z;
}

bool operator != (tdeVector3f& a, tdeVector3f& b)
{
    return a.x != b.x || a.y != b.y || a.z != b.z;
}


So hier die ganze Klassen-Deklaration.

Zitat

Solltest du dir nochmal überlegen, ob der Rückgabewert (und der Code) bei = wirklich das ist, was du willst..


Danke... Hab den Fehler gefunden :-)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

03.06.2008, 14:38

Da du den Fehler gefunden hast hier trotzdem noch die Erklärung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class tdeVector3f
{
public:
  // ...

  tdeVector3f& operator=( const tdeVector3f& a );
  tdeVector3f& operator+=( const tdeVector3f& a );
};

tdeVector3f& tdeVector3f::operator=( const tdeVector3f& a )
{
   x = a.x;
   y = a.y;
   z = a.z;
   return *this; 
}

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


Zitat von »"drakon"«


Solltest du dir nochmal überlegen, ob der Rückgabewert ...


Welcher bessere Rückgabewert würde dir denn spontan einfallen?
@D13_Dreinig

5

03.06.2008, 14:44

Oh, natürlich:

C-/C++-Quelltext

1
2
3
4
tdeVector3f& operator = (const tdeVector3f& a)
{
    return a;
}


Ist das besser so? ;)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

03.06.2008, 14:47

Zitat von »"David_pb"«


Welcher bessere Rückgabewert würde dir denn spontan einfallen?


Sorry, falsch geschaut. Der passt so schon. :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

03.06.2008, 14:49

Zitat von »"Melechesh"«

Oh, natürlich:

C-/C++-Quelltext

1
2
3
4
tdeVector3f& operator = (const tdeVector3f& a)
{
    return a;
}


Ist das besser so? ;)


Nein!
@D13_Dreinig

8

03.06.2008, 14:50

@david_pb: :oops:, in demfall hab ich keine Ahnung was du meinst! :(

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

03.06.2008, 14:50

Zitat von »"Melechesh"«

Oh, natürlich:

C-/C++-Quelltext

1
2
3
4
tdeVector3f& operator = (const tdeVector3f& a)
{
    return a;
}


Ist das besser so? ;)


Wo ist den da jetzt die Zuweisung?

EDIT:
Er hat ja den Fehler (oder besser gesagt das Richtige) oben bereits gepostet.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

03.06.2008, 14:59

Zitat von »"Melechesh"«

@david_pb: :oops:, in demfall hab ich keine Ahnung was du meinst! :(


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.
@D13_Dreinig

Werbeanzeige