Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Przeciązanie operatora +

Ostatnio zmodyfikowano 2013-07-22 20:54
Autor Wiadomość
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:
C/C++
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
P-88585
Admixior
» 2013-07-22 19:31:01
Pokaż jeszcze przeładowanie operatora + :)
P-88589
johny
Temat założony przez niniejszego użytkownika
» 2013-07-22 19:33:16
C/C++
dPoint2D & dPoint2D::operator +( const dPoint2D & P ) const {
    dPoint2D tmp;
    tmp.x = this->x + P.x;
    tmp.y = this->y + P.y;
    return tmp;
}
P-88590
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.
P-88592
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: » standard C++ / Przeciążanie operatorówoperator+
P-88593
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 :<
C/C++
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&'
P-88594
pekfos
» 2013-07-22 20:25:14
Operatory =, ==, != powinny przyjmować referencję na stałą.
P-88597
johny
Temat założony przez niniejszego użytkownika
» 2013-07-22 20:54:37
Ok działa. Dzięki :)
P-88600
« 1 »
  Strona 1 z 1