tiger133 Temat założony przez niniejszego użytkownika |
[C++] operatory nie obsluguja bardziaj zlozonych wyrazen » 2013-08-17 13:25:19 Witam , ostanio w ramach treningu chciałem napisać własną klasę "wektor" , jednak napotkałem na kilka problemów: Plik "wektor.h" #ifndef WEKTOR_H_INCLUDED #define WEKTOR_H_INCLUDED #include <iostream> #include <math.h> #define POKARZ(x) cout<<#x<<" = "; using namespace std;
const long double G = 6.67;
class wektor { public: double x, y, z; wektor() : x( 0 ) , y( 0 ) , z( 0 ) { }; wektor( double xx, double yy, double zz ) : x( xx ) , y( yy ) , z( zz ) { }; wektor( wektor & obj ); wektor & operator *( double skalar ); wektor & operator /( double k ); wektor & operator *( wektor & v ); wektor & operator -( wektor & b ); wektor & operator +( wektor & b ); wektor & operator +=( wektor & b ); double odleglosc( wektor a ); double dlugosc() { double dl = sqrt( x * x + y * y + z * z ); return dl; } void zmiana_warotsci( double a, double b, double c ) { x = a; y = b; z = c; } void pokarz() { cout << "[" << x << "], [" << y << "], [" << z << "]" << endl; } }; ostream & operator <<( ostream & ekran, wektor & a );
#endif
Plik "wektor.cpp" #include "wektor.h"
wektor::wektor( wektor & obj ) { x = obj.x; y = obj.y; z = obj.z; } wektor & wektor::operator *( double skalar ) { wektor temp( 0, 0, 0 ); temp.x = x * skalar; temp.y = y * skalar; temp.z = z * skalar; return temp; }
wektor & wektor::operator *( wektor & v ) { wektor tmp; tmp.x = y * v.z - v.y * z; tmp.y =-( x * v.z - v.x * z ); tmp.z = x * v.y - v.x * y; return tmp; } wektor & wektor::operator -( wektor & b ) { wektor tmp; tmp.x = x - b.x; tmp.y = y - b.y; tmp.z = z - b.z; return tmp; }
double wektor::odleglosc( wektor a ) { wektor tmp( x - a.x, y - a.y, z - a.z ); double odl = sqrt( tmp.x * tmp.x + tmp.y * tmp.y + tmp.z * tmp.z ); return odl; } wektor & wektor::operator /( double k ) { wektor tmp( 0, 0, 0 ); if( k != 0 ) { tmp.x = x / k; tmp.y = y / k; tmp.z = y / k; } return tmp; }
wektor & wektor::operator +( wektor & b ) { wektor rezultat; rezultat.x = b.x + x; rezultat.y = b.y + y; rezultat.z = b.z + z; return rezultat; } wektor & wektor::operator +=( wektor & b ) { x += b.x; y += b.y; z += b.z; return * this; } ostream & operator <<( ostream & ekran, wektor & a ) { ekran << "[" << a.x << "], [" << a.y << "], [" << a.z << "]" << endl; }
Plik "main.cpp" #include <iostream> #include "wektor.h" #include <string> #define POKARZ(x) cout<<#x<<" = "<<x;
int main()
{ double masa1 = 2, masa2 = 3, odleglosc; wektor polozenie1( 0, 0, 0 ), polozenie2( 1, 0, 0 ), przyspieszenie, predkosc, sila; odleglosc = polozenie2.odleglosc( polozenie1 ); sila =(( polozenie2 - polozenie1 ) *( G * masa1 * masa2 ) ) /( odleglosc * odleglosc * odleglosc ); POKARZ( sila ); }
Problem pojawia się w funkcji main, kompilacja przebiega okej. Tylko wartość wektora sily jest zawsze w każdym kierunku równy zeru ([0][0][0]). Proszę o jakieś sugestie co należało by zmienić żeby można było wykonywać takie operacje. I żeby wychodziły prawdziwe wyniki ; ) |
|
Elaine |
» 2013-08-17 13:43:52 Operatory +, -, * i / powinny zwracać wartość, nie referencję, obecnie zwracają referencje do obiektów tymczasowych, które po powrocie z funkcji przestają istnieć. |
|
tiger133 Temat założony przez niniejszego użytkownika |
» 2013-08-17 14:51:55 Dzięki wielkie z odpowiedz ; ) mam jeszcze jedno pytanie jak wykonać takie działanie: double dt = 1; wektor predkosc( 0, 0, 0 ), przyspieszenie( 1, 0, 0 );
predkosc +=( przyspiesznie * dt )
niby po pomnożeniu przyspiesznie*dt wychodzi wektor(zmienilem jeden fragment): wektor wektor::operator *( double skalar ) { wektor temp( 0, 0, 0 ); temp.x = x * skalar; temp.y = y * skalar; temp.z = z * skalar; return temp; }
operator += : wektor wektor::operator +=( wektor & b ) { x += b.x; y += b.y; z += b.z; return * this; } ale nadal nie działa ;/ |
|
Elaine |
» 2013-08-17 15:19:10 Zwykła referencja nie może się odnosić do obiektu tymczasowego, referencja do stałej może, więc operator+= powinien przyjmować const wektor& (i zwracać wektor&, ale to nie jest tu problemem). |
|
DejaVu |
» 2013-08-21 17:18:38 Przykłady poprawnie przeciążonych operatorów masz tu: Przeciążanie operatorów. Co prawda nie ma jeszcze przykładów do wszystkich operatorów, ale to powinno być wystarczające. |
|
« 1 » |