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

[C++] operatory nie obsluguja bardziaj zlozonych wyrazen

Ostatnio zmodyfikowano 2013-08-21 17:18
Autor Wiadomość
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"
C/C++
#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 // WEKTOR_H_INCLUDED
Plik "wektor.cpp"
C/C++
#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"
C/C++
#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 );
   
    // jest to klasyczny  wzor na wektor sily F=G(m1)(m2)* R/r^3 ,
    // gdzie G(m1)(m2) i "r"=(odleglosc)  to skalary, a "R"=(polozenie2-polozenie1) to wektor
    // G jest w pliku "wektor.h"
   
    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 ; )
P-90425
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ć.
P-90428
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:
C/C++
double dt = 1;
wektor predkosc( 0, 0, 0 ), przyspieszenie( 1, 0, 0 );

predkosc +=( przyspiesznie * dt ) // nie chce działać (nie kompiluje się)

niby po pomnożeniu przyspiesznie*dt wychodzi wektor(zmienilem jeden fragment):
C/C++
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 +=  :

C/C++
wektor wektor::operator +=( wektor & b )
{
    x += b.x;
    y += b.y;
    z += b.z;
    return * this;
}

ale nadal nie działa ;/
P-90435
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).
P-90440
DejaVu
» 2013-08-21 17:18:38
Przykłady poprawnie przeciążonych operatorów masz tu: » standard C++Przeciążanie operatorów. Co prawda nie ma jeszcze przykładów do wszystkich operatorów, ale to powinno być wystarczające.
P-90703
« 1 »
  Strona 1 z 1