[C++] Przeciązanie operatora +
Ostatnio zmodyfikowano 2013-07-22 20:54
johny Temat założony przez niniejszego użytkownika |
[C++] Przeciązanie operatora + » 2013-07-22 19:22:19 Przeciążyłem operator mnożenia, dla klasy dPoint2D w taki sposób:
double & dPoint2D::operator *( const dPoint2D & P ) const { if( this ==& P ) std::cout << "ten sam adres!" << std::endl; double tmp; tmp = this->x * P.x + this->y * P.y; return tmp; }
Jeśli teraz wykonuje mnożenie o tak: double wynik = p1 * p2; to działa okej, a jeśli double wynik =( p1 + p3 ) *( p2 + p4 ); to operator działa nieprawidłowo (adres this jest równy adresowi P). Jak to można naprawić?;p |
|
Admixior |
» 2013-07-22 19:31:01 Pokaż jeszcze przeładowanie operatora + :) |
|
johny Temat założony przez niniejszego użytkownika |
» 2013-07-22 19:33:16 dPoint2D & dPoint2D::operator +( const dPoint2D & P ) const { dPoint2D tmp; tmp.x = this->x + P.x; tmp.y = this->y + P.y; return tmp; }
|
|
Monika90 |
» 2013-07-22 19:42:13 Operator jest nieprawdiłowy, ponieważ zwraca referencję do zmiennej lokalnej. Po powrocie z operatora ta zmienna nie istnieje, więc referencja jest nieważna. |
|
DejaVu |
» 2013-07-22 19:45:26 No właśnie też miałem napisać, że dla operatora + nie zwraca się referencji tylko wartość :)
/edit:
A tu jeszcze przykład: operator+ |
|
johny Temat założony przez niniejszego użytkownika |
» 2013-07-22 19:48:20 Hmm, czyli tylko dla operatora przypisania referencję zwracamy? Gdzieś widziałem, że zwracali dla dodawania referencję. Pomyślałem: "aaa, będzie szybciej działało, to zwrócę referencję". I rzeczywiście szybciej, tylko przy tym 'mniej prawidłowo' xD Edit: Dobra to jeszcze raz, bo teraz przestało się kompilować po usunięciu referencji :< dPoint2D & dPoint2D::operator =( dPoint2D & P ) { if( this ==& P ) return * this; else { this->x = P.x; this->y = P.y; return * this; } }
bool dPoint2D::operator ==( dPoint2D & P ) { if(( this->x == P.x ) &&( this->y == P.y ) ) return true; else return false; }
bool dPoint2D::operator !=( dPoint2D & P ) { if(( this->x != P.x ) ||( this->y != P.y ) ) return true; else return false; }
dPoint2D dPoint2D::operator +( const dPoint2D & P ) const { dPoint2D tmp; tmp.x = this->x + P.x; tmp.y = this->y + P.y; return tmp; } dPoint2D dPoint2D::operator -( const dPoint2D & P ) const { dPoint2D tmp; tmp.x = this->x - P.x; tmp.y = this->y - P.y; return tmp; } double dPoint2D::operator *( const dPoint2D & P ) const { if( this ==& P ) std::cout << "ten sam!" << std::endl; double tmp; tmp = this->x * P.x + this->y * P.y; return tmp; } dPoint2D dPoint2D::operator *( const double & k ) const { dPoint2D tmp; tmp.x = this->x * k; tmp.y = this->y * k; return tmp; } dPoint2D dPoint2D::operator /( const double & k ) const { dPoint2D tmp; if( k == 0 ) return tmp; tmp.x = this->x / k; tmp.y = this->y / k; return tmp; }
d4 = d1 +( d2 - d1 ) * u; , d1,d2,d3,d4 to typ dPoint2D; u to double. ../rzutowanie_test/main.cpp: In function 'int main()': ../rzutowanie_test/main.cpp:97:35: error: no match for 'operator=' in 'd4 = d1.dPoint2D::operator+((*(const dPoint2D*)(& d2.dPoint2D::operator-((*(const dPoint2D*)(& d1))).dPoint2D::operator*((*(const double*)(& u))))))' ../rzutowanie_test/main.cpp:97:35: note: candidate is: In file included from ../rzutowanie_test/main.cpp:5:0: ../rzutowanie_test/dPoint2D.h:11:15: note: dPoint2D& dPoint2D::operator=(dPoint2D&) ../rzutowanie_test/dPoint2D.h:11:15: note: no known conversion for argument 1 from 'dPoint2D' to 'dPoint2D&'
|
|
pekfos |
» 2013-07-22 20:25:14 Operatory =, ==, != powinny przyjmować referencję na stałą. |
|
johny Temat założony przez niniejszego użytkownika |
» 2013-07-22 20:54:37 Ok działa. Dzięki :) |
|
« 1 » |