[C++] Operator+= not found

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Om een lang verhaal kort te maken:

Deze code werkt:
C++:
1
2
Vertex2D<float> incr = tween.getTween();
progress += incr;


Op dezelfde plek, deze code niet:
C++:
1
progress += tween.getTween();

main.cpp:19: error: no match for 'operator+=' in 'progress += Tween<T>::getTween() [with T = Vertex2D<float>]()'

Mijn vraag: waarom werkt het bovenste wel en het onderste niet?

Volledige main.cpp:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include "EasedTween.cpp"
#include "TickCounter.hpp"
#include "Vertex2D.cpp"

int main(int argc, char * const argv[]) {
    const TickCount duration = 20;
    Vertex2D<float> mov(100.0f, 50.0f);
    
    Tween<Vertex2D<float> > tween(mov, duration);
    Vertex2D<float> progress(0.0f, 0.0f);
    
    std::cout << "float:\n";
    for(int i=0;i<=duration;i++)
    {
        std::cout << "[" << progress.getX() << ", "
                         << progress.getY() << "]\n";
        tween.tick();
        progress += tween.getTween();
    }
    
    return 0;
};


Vertex2D (deel van de implementatie, niet compleet)
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<class T>
Vertex2D<T> Vertex2D<T>::operator+=(Coordinate2D<T> &v2d)
{
    this->x += v2d.getX();
    this->y += v2d.getY();
    return *this;
};

template<class T>
Vertex2D<T> Vertex2D<T>::operator+=(T t)
{
    this->x += t;
    this->y += t;
    return *this;
};


Tween::getTween()
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class T>
T Tween<T>::getTween()
{
    TickCountProgress tickProgress = this->getTickProgress();
    if(tickProgress < 1.0f)
    {
        T tween = this->getTweenAtProgress(tickProgress);
        tween -= this->tweenDone;
        this->tweenDone += tween;
        return tween;
    }
    else if(!this->isFinished()) {
        T tween = this->tweenTotal - this->tweenDone;
        this->tweenDone = this->tweenTotal;
        return tween;
    }
    else {
        return T(0);
    }
};

[ Voor 20% gewijzigd door Gamebuster op 18-08-2010 19:19 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 21-08 23:06

HMS

Het verschil is Tween<Vertex2D<float>> en Vertex2D<float>, misschien kan je hier iets mee?

Werkt dit?

C++:
1
progress += (Vertex2D<float>)tween.getTween();


~edit: Disclaimer: ben geen C++ guru ;)

[ Voor 10% gewijzigd door HMS op 18-08-2010 19:22 ]


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
HMS schreef op woensdag 18 augustus 2010 @ 19:21:
Het verschil is Tween<Vertex2D<float>> en Vertex2D<float>, misschien kan je hier iets mee?

Werkt dit?

C++:
1
progress += (Vertex2D<float>)tween.getTween();


~edit: Disclaimer: ben geen C++ guru ;)
tween.getTween geeft al een Vertex2D<float> terug, dat is het vreemde. Zie ook de declaratie:
Tween<Vertex2D<float> > tween(mov, duration);

::getTween geeft, ondanks zijn misleidende naam, het type T binnen de template terug, wat in de declaratie een Vertex2D<float> is. ::getTween geeft dus een Vertex2D<float> terug.

Die typecast ervoor zetten had in ieder geval geen enkel bij-effect:
C++:
1
progress += (Vertex2D<float>)tween.getTween();

C++:
1
progress += (Vertex2D<float>)(tween.getTween());

Beide dezelfde error:
main.cpp:19: error: no match for 'operator+=' in 'progress += Tween<T>::getTween() [with T = Vertex2D<float>]()'

[ Voor 13% gewijzigd door Gamebuster op 18-08-2010 19:27 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Ik neem aan dat het de bedoeling is dat de operator
C++:
1
2
template<class T> 
Vertex2D<T> Vertex2D<T>::operator+=(Coordinate2D<T> &v2d)

zou moeten worden gebruikt? Mogelijk heeft de compiler een probleem om een referentie naar een anonieme tussenvariable mee te geven. Probeer het eens met
C++:
1
2
template<class T> 
Vertex2D<T> Vertex2D<T>::operator+=(Coordinate2D<T> v2d)

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Mijzelf schreef op woensdag 18 augustus 2010 @ 19:38:
Ik neem aan dat het de bedoeling is dat de operator
C++:
1
2
template<class T> 
Vertex2D<T> Vertex2D<T>::operator+=(Coordinate2D<T> &v2d)

zou moeten worden gebruikt? Mogelijk heeft de compiler een probleem om een referentie naar een anonieme tussenvariable mee te geven. Probeer het eens met
C++:
1
2
template<class T> 
Vertex2D<T> Vertex2D<T>::operator+=(Coordinate2D<T> v2d)
Coordinate2D<T> is een abstract type, moet een pointer ernaar gebruiken. Verder moet het ook kunnen rekenen met andere implementaties van Coordinate2D<T>.


C++:
1
2
3
4
5
6
7
8
9
10
11
12
template<class T>
class Coordinate2D
{
public:
    virtual T getX() = 0;
    virtual T getY() = 0;
    
    bool operator==(Coordinate2D<T> &);
    bool operator!=(Coordinate2D<T> &);
    
    ~Coordinate2D(){};
};


C++:
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
/** An implementation of Coordinate2D<T> */
template <class T>
class Vertex2D: public Coordinate2D<T>
{
protected: 
    
    /** The first vertex dimension. */
    T x;
    
    /** The second vertex dimension. */
    T y;
    
public:
    
    Vertex2D();
    Vertex2D(T t);
    Vertex2D(T x, T y);
    
    virtual T getX();
    virtual T getY();
    
    Vertex2D<T> operator+(Coordinate2D<T> &);
    Vertex2D<T> operator-(Coordinate2D<T> &);
    Vertex2D<T> operator*(Coordinate2D<T> &);
    Vertex2D<T> operator/(Coordinate2D<T> &);
    
    Vertex2D<T> operator+=(Coordinate2D<T> &);
    Vertex2D<T> operator-=(Coordinate2D<T> &);
    Vertex2D<T> operator*=(Coordinate2D<T> &);
    Vertex2D<T> operator/=(Coordinate2D<T> &);
    
    Vertex2D<T> operator+(T);
    Vertex2D<T> operator-(T);
    Vertex2D<T> operator*(T);
    Vertex2D<T> operator/(T);
    
    Vertex2D<T> operator+=(T);
    Vertex2D<T> operator-=(T);
    Vertex2D<T> operator*=(T);
    Vertex2D<T> operator/=(T);
};

[ Voor 51% gewijzigd door Gamebuster op 18-08-2010 19:49 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • DroogKloot
  • Registratie: Februari 2001
  • Niet online

DroogKloot

depenisvanjezus

Je mist een

C++:
1
2
3
4
Vertex2D<T>& operator += (const Vertex2D<T>& v) {
    // ...
    return *this;
}

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
DroogKloot schreef op woensdag 18 augustus 2010 @ 19:51:
Je mist een

C++:
1
2
3
4
Vertex2D<T>& operator += (const Vertex2D<T>& v) {
    // ...
    return *this;
}
C++:
1
2
3
4
5
6
7
template<class T>
Vertex2D<T>& Vertex2D<T>::operator+=(Coordinate2D<T> &v2d)
{
    this->x += v2d.getX();
    this->y += v2d.getY();
    return *this;
};

main.cpp:19: error: no match for 'operator+=' in 'progress += TweenHandler<T>::getTween() [with T = Vertex2D<float>]()'

C++:
1
2
3
4
5
6
7
template<class T>
Vertex2D<T>& Vertex2D<T>::operator+=(const Coordinate2D<T> &v2d)
{
    this->x += v2d.getX();
    this->y += v2d.getY();
    return *this;
};

Vertex2D.cpp:110: error: passing 'const Coordinate2D<float>' as 'this' argument of 'T Coordinate2D<T>::getX() [with T = float]' discards qualifiers
Vertex2D.cpp:111: error: passing 'const Coordinate2D<float>' as 'this' argument of 'T Coordinate2D<T>::getY() [with T = float]' discards qualifiers

Gaat weer lekker :P

Wat ik ook doe, het aantal errors neemt alleen maar enorm toe :P

[ Voor 62% gewijzigd door Gamebuster op 18-08-2010 20:02 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
DroogKloot schreef op woensdag 18 augustus 2010 @ 19:51:
Je mist een

C++:
1
2
3
4
Vertex2D<T>& operator += (const Vertex2D<T>& v) {
    // ...
    return *this;
}
Dat mag dan ook een
C++:
1
 Vertex2D<T> operator+=(const Coordinate2D<T> &);

zijn, lijkt me. Dan moet
C++:
1
virtual T getX();

ook const worden, trouwens.

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<class T>
class Coordinate2D
{
public:
    virtual T getX() const = 0;
    virtual T getY() const = 0;
    
    bool operator==(Coordinate2D<T> &coord) const
    {
        return this->getX() == coord.getX()
            && this->getY() == coord.getY();
    };
    
    bool operator!=(Coordinate2D<T> &coord) const
    {
        return this->getX() != coord.getX()
            || this->getY() != coord.getY();
    };
    
    ~Coordinate2D(){};
};


C++:
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
template <class T>
class Vertex2D: public Coordinate2D<T>
{
protected: 
    
    /** The vertex dimensions. */
    T x, y;
    
public:
    
    Vertex2D(): x(0), y(0) {};
    Vertex2D(T t): x(t), y(t) {};
    Vertex2D(T x, T y): x(x), y(y) {};
    
    virtual T getX() const {return this->x;};
    virtual T getY() const {return this->y;};
    
    Vertex2D<T> operator+(const Coordinate2D<T> &coord){return (*this)+=coord;};
    Vertex2D<T> operator-(const Coordinate2D<T> &coord){return (*this)-=coord;};
    Vertex2D<T> operator*(const Coordinate2D<T> &coord){return (*this)*=coord;};
    Vertex2D<T> operator/(const Coordinate2D<T> &coord){return (*this)/=coord;};
    
    Vertex2D<T> operator+=(const Coordinate2D<T> &coord)
    {
        this->x += coord.getX();
        this->y += coord.getY();
        return *this;
    };
    
    Vertex2D<T> operator-=(const Coordinate2D<T> &coord)
    {
        this->x -= coord.getX();
        this->y -= coord.getY();
        return *this;
    };
    
    Vertex2D<T> operator*=(const Coordinate2D<T> &coord)
    {
        this->x *= coord.getX();
        this->y *= coord.getY();
        return *this;
    };
    
    Vertex2D<T> operator/=(const Coordinate2D<T> &coord)
    {
        this->x /= coord.getX();
        this->y /= coord.getY();
        return *this;
    };
    
    Vertex2D<T> operator+(const T t){return (*this)+=t;};
    Vertex2D<T> operator-(const T t){return (*this)-=t;};
    Vertex2D<T> operator*(const T t){return (*this)*=t;};
    Vertex2D<T> operator/(const T t){return (*this)/=t;};
    
    Vertex2D<T> operator+=(const T t)
    {
        this->x += t;
        this->y += t;
        return *this;
    };
    
    Vertex2D<T> operator-=(const T t)
    {
        this->x -= t;
        this->y -= t;
        return *this;
    };
    
    Vertex2D<T> operator*=(const T t)
    {
        this->x *= t;
        this->y *= t;
        return *this;
    };
    
    Vertex2D<T> operator/=(const T t)
    {
        this->x /= t;
        this->y /= t;
        return *this;
    };
};


Werkt nu :D

Bedankt, allen.

Wat een vervelende taal is C++ toch soms :P

edit:
compacte versie neergeplakt

[ Voor 62% gewijzigd door Gamebuster op 18-08-2010 20:19 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Jarno
  • Registratie: Augustus 2004
  • Laatst online: 20:11
Check dit leesvoer eens..;)

Edit; Er zit ook een dik dictaat bij, dat verder borduurt op C.. :)

[ Voor 31% gewijzigd door Jarno op 18-08-2010 20:26 ]


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Bookmarked.

Ik ben inderdaad nog lerende, net begonnen aan C++ vanuit PHP en Java.

Heb ook al boek aangeschaft (en gebruik 'm ook daadwerkelijk) en lees aardig wat tut's door voor informatie over wat de beste manieren zijn om iets te bereiken.

[ Voor 27% gewijzigd door Gamebuster op 18-08-2010 20:21 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • NC83
  • Registratie: Juni 2007
  • Laatst online: 21-08 21:44
Het getter probleem dat je had komt doordat de parameter die je invoert const is en niet const gedeclareerde methoden niet op een const object mogen worden aan geroepen. Google eens op const correctness.

Een andere goeie hulp bron is http://www.cplusplus.com/ als naslagwerk

[ Voor 15% gewijzigd door NC83 op 18-08-2010 23:16 ]

ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

NC83 schreef op woensdag 18 augustus 2010 @ 23:12:
Het getter probleem dat je had komt doordat de parameter die je invoert const is en niet const gedeclareerde methoden niet op een const object mogen worden aan geroepen.
Dat is op zich waar maar niet wat hier van toepassing is. Het probleem is dat getTween() een rvalue teruggeeft, en rvalues kunnen niet binden aan non-const references (en de paramater van operator+= verwachtte juist een non-const ref).

[ Voor 7% gewijzigd door .oisyn op 19-08-2010 09:59 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
NC83 schreef op woensdag 18 augustus 2010 @ 23:12:
Het getter probleem dat je had komt doordat de parameter die je invoert const is en niet const gedeclareerde methoden niet op een const object mogen worden aan geroepen. Google eens op const correctness.

Een andere goeie hulp bron is http://www.cplusplus.com/ als naslagwerk
cplusplus is goed ja

Ik gebruik hoofdzakelijk cplusplus.com, "C++ Cookbook" en Apple developer documentation van O Reilly
.oisyn schreef op donderdag 19 augustus 2010 @ 09:58:
[...]

Dat is op zich waar maar niet wat hier van toepassing is. Het probleem is dat getTween() een rvalue teruggeeft, en rvalues kunnen niet binden aan non-const references (en de paramater van operator+= verwachtte juist een non-const ref).
Ik heb werkelijk geen flauw idee waar dit over gaat :P

[ Voor 28% gewijzigd door Gamebuster op 19-08-2010 19:25 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

:P

De termen "lvalue" en "rvalue" zijn afgeleid van assignment expressies, zoals bijv. "a = 5". Een lvalue is iets waar je een waarde aan kunt assignen, meestal een variabele, en een rvalue is een waarde die je kunt assignen. Vandaar ook l- en rvalue, omdat ze resp. links en rechts van de = staan. "a" is dus de lvalue, en "5" is een rvalue. Je kunt niet doen "5 = a", want 5 is nou eenmaal geen variabele. Hetzelfde geldt voor het resultaat van een functieaanroep. In beginsel kan iets als "foo() = 4" ook niet. Een lvalue is natuurlijk ook een rvalue - je kunt 'm assignen, en daarom mag iets als "a = b" ook. Maar andersom niet.

En dan heb je C++, die referenties ondersteunt. Als een expressie in C++ resulteert in een type dat geen non-const referentie is, dan is dat in feite een rvalue. Als foo() bijvoorbeeld een int retourneert, dan is dat dus een rvalue. Daarentegen, lvalues zijn expressies die een non-const referentie naar een object teruggeven.

Nou kun je in principe wel een referentie verkrijgen naar een rvalue, maar alleen als deze const is. Wat er dan onder water gebeurt is dat er tijdelijk een object wordt aangemaakt waar de referentie naar wijst. In C++ kun je dus wel dit doen:
C++:
1
const int & a = 34;

Hoewel 34 eigenlijk geen object is dat een referentie heeft, kan er wel tijdelijk een int object worden aangemaakt met die waarde, om daar vervolgens de referentie van te nemen. Het is expres niet toegestaan om een non-const referentie te verkrijgen, omdat je dan evt zou kunnen denken dat je de waarde aan kunt passen. Maar "34" kun je nou eenmaal niet aanpassen, dat is gewoon 34. Uiteraard kun je redeneren dat je het tijdelijke int object wel aan zou kunnen passen, maar dat zou mogelijk verwarring met zich meebrengen. Vandaar dus de regel "an rvalue cannot bind to a non-const reference".

In jouw code gebeurde in feite exact hetzelfde. Je hebt een operator +=, die een non-const referentie verwacht, en een functie die een object teruggeeft. Versimpeld zag dat er zo uit:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int foo()
{
    return 42;
}

void bar(int & i)
{
    // ...
}

int main()
{
    bar(foo())
}

Maar, het resultaat van foo() is een rvalue, en bar() verwacht een non-const reference. Resultaat: compile error. Verander je bar() zo dat hij een const ref verwacht (omdat je 'm toch niet aanpast), dan mag het wel.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
.oisyn schreef op donderdag 19 augustus 2010 @ 19:42:
:P

De termen "lvalue" en "rvalue" zijn afgeleid van assignment expressies, zoals bijv. "a = 5". Een lvalue is iets waar je een waarde aan kunt assignen, meestal een variabele, en een rvalue is een waarde die je kunt assignen. Vandaar ook l- en rvalue, omdat ze resp. links en rechts van de = staan. "a" is dus de lvalue, en "5" is een rvalue. Je kunt niet doen "5 = a", want 5 is nou eenmaal geen variabele. Hetzelfde geldt voor het resultaat van een functieaanroep. In beginsel kan iets als "foo() = 4" ook niet. Een lvalue is natuurlijk ook een rvalue - je kunt 'm assignen, en daarom mag iets als "a = b" ook. Maar andersom niet.

En dan heb je C++, die referenties ondersteunt. Als een expressie in C++ resulteert in een type dat geen non-const referentie is, dan is dat in feite een rvalue. Als foo() bijvoorbeeld een int retourneert, dan is dat dus een rvalue. Daarentegen, lvalues zijn expressies die een non-const referentie naar een object teruggeven.

Nou kun je in principe wel een referentie verkrijgen naar een rvalue, maar alleen als deze const is. Wat er dan onder water gebeurt is dat er tijdelijk een object wordt aangemaakt waar de referentie naar wijst. In C++ kun je dus wel dit doen:
C++:
1
const int & a = 34;

Hoewel 34 eigenlijk geen object is dat een referentie heeft, kan er wel tijdelijk een int object worden aangemaakt met die waarde, om daar vervolgens de referentie van te nemen. Het is expres niet toegestaan om een non-const referentie te verkrijgen, omdat je dan evt zou kunnen denken dat je de waarde aan kunt passen. Maar "34" kun je nou eenmaal niet aanpassen, dat is gewoon 34. Uiteraard kun je redeneren dat je het tijdelijke int object wel aan zou kunnen passen, maar dat zou mogelijk verwarring met zich meebrengen. Vandaar dus de regel "an rvalue cannot bind to a non-const reference".

In jouw code gebeurde in feite exact hetzelfde. Je hebt een operator +=, die een non-const referentie verwacht, en een functie die een object teruggeeft. Versimpeld zag dat er zo uit:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int foo()
{
    return 42;
}

void bar(int & i)
{
    // ...
}

int main()
{
    bar(foo())
}

Maar, het resultaat van foo() is een rvalue, en bar() verwacht een non-const reference. Resultaat: compile error. Verander je bar() zo dat hij een const ref verwacht (omdat je 'm toch niet aanpast), dan mag het wel.
Ik heb het 2x moeten lezen, en toen viel er een 2-euro-munt. Bedankt voor je uitleg :D

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
Mag die in de FAQ? :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19:10

Robtimus

me Robtimus no like you

Gamebuster schreef op woensdag 18 augustus 2010 @ 20:07:
C++:
1
2
3
4
    Vertex2D<T> operator+(const Coordinate2D<T> &coord){return (*this)+=coord;};
    Vertex2D<T> operator-(const Coordinate2D<T> &coord){return (*this)-=coord;};
    Vertex2D<T> operator*(const Coordinate2D<T> &coord){return (*this)*=coord;};
    Vertex2D<T> operator/(const Coordinate2D<T> &coord){return (*this)/=coord;};
Dus als ik ergens "c = a + b" neerzet dan wordt a aangepast en is c achteraf niets anders dan een pointer / reference naar hetzelfde object als a? Is dat echt de bedoeling?

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nou ja "c" is een kopie van de nieuwe "a", maar je hebt helemaal gelijk dat "a" nu wordt aangepast 8)7. Sowieso moet de method dus const zijn, dan had dit niet eens kunnen gebeuren (en je wilt immers ook const vectors op kunnen tellen), maar nog liever implementeer je dergelijke operators buiten de klasse (zodat je gebruik kunt maken van implicit conversions, mochten die van toepassing zijn.

Als we dan toch bezig zijn:
C++:
1
    Vertex2D(T t): x(t), y(t) {}; 

Die wil je waarschijnlijk explicit hebben. Of wil je dat een float impliciet converteerbaar is naar een Vector2D<float>? Let erop, je kunt dan ook doen "v + 5" ofzo. Wiskundig gezien klopt daar natuurlijk niets van :)

En de hele naam "Vertex" lijkt me ongelukkig gekozen. Een vertex is een hoekpunt (zoals van een polygoon), en kan wel meer properties hebben dan alleen de coordinaten, en ermee kunnen rekenen lijkt me daarom nutteloos. Vector2D lijkt me een beter. Een daadwerkelijke vertex heeft dan een Vector2D als property (onder de naam "position" oid)

@NMe: sure

[ Voor 86% gewijzigd door .oisyn op 20-08-2010 15:27 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als .oisyn dat goed vindt. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1