cristiano250 Temat założony przez niniejszego użytkownika |
Problem z przeciążaniem operatorów » 2012-11-03 20:18:13 #include <cstdlib> #include <cmath> #include <iostream> #include <iomanip> #include <ostream>
using namespace std; using std::cout; using std::cin;
class Wektor3 { public: Wektor3( void ); Wektor3( double x, double y, double z ); Wektor3( const Wektor3 & w ); double X( void ) { return _x; } double Y( void ) { return _y; } double Z( void ) { return _z; } Wektor3 & Assign( double x, double y, double z ); Wektor3 & operator =( const Wektor3 & w ); double operator !( void ); double Azym( void ); double Elev( void ); Wektor3 & operator +=( const Wektor3 & w ); Wektor3 & operator *=( double k ); friend Wektor3 operator +( const Wektor3 & w1, const Wektor3 & w2 ); friend Wektor3 operator *( double k, const Wektor3 & w ); friend Wektor3 operator *( const Wektor3 & w, double k ); friend bool operator ==( const Wektor3 & w1, const Wektor3 & w2 ); friend bool operator !=( const Wektor3 & w1, const Wektor3 & w2 ); private: double _x, _y, _z; }; ostream operator <<( ostream & s, Wektor3 & w ); istream operator >>( istream & s, Wektor3 & w );
Wektor3::Wektor3( void ) { _x = _y = _z = 0.0; }
Wektor3::Wektor3( double x, double y, double z ) { _x = x; _y = y; _z = z; }
Wektor3::Wektor3( const Wektor3 & w )
{ _x = w._x; _y = w._y; _z = w._z; }
Wektor3 & Wektor3::Assign( double x, double y, double z ) { _x = x; _y = y; _z = z; return * this; }
Wektor3 & Wektor3::operator =( const Wektor3 & w )
{ _x = w._x; _y = w._y; _z = w._z; return * this; }
double Wektor3::operator !( void )
{ long double dlugosc; dlugosc = sqrt(( _x * _x ) +( _y * _y ) +( _z * _z ) ); return dlugosc; }
double Wektor3::Azym( void )
{ double azymut; azymut = acos( _x / sqrt(( _x * _x ) +( _y * _y ) ) ); if( - 180 < azymut && azymut <= 180 ) return azymut; }
double Wektor3::Elev( void )
{ double elewacja; elewacja = asin( _z /( sqrt(( _x * _x ) +( _y * _y ) +( _z * _z ) ) ) ); if( - 90 <= elewacja && elewacja <= 90 ) return elewacja; }
Wektor3 & Wektor3::operator +=( const Wektor3 & w )
{ _x += w._x; _y += w._y; _z += w._z; return * this; }
Wektor3 & Wektor3::operator *=( double k )
{ _x *= k; _y *= k; _z *= k; return * this; }
Wektor3 operator +( const Wektor3 & w1, const Wektor3 & w2 )
{ Wektor3 suma( w1._x + w2._x, w1._y + w2._y, w1._z + w2._z ); return suma; }
Wektor3 operator *( double k, const Wektor3 & w )
{ Wektor3 iloczynliczba(( w._x ) * k,( w._y ) * k,( w._z ) * k ); return iloczynliczba; }
Wektor3 operator *( const Wektor3 & w, double k )
{ Wektor3 iloczynliczba( k *( w._x ), k *( w._y ), k *( w._z ) ); return iloczynliczba; }
bool operator ==( const Wektor3 & w1, const Wektor3 & w2 )
{ bool wektory_sa_rowne = 0; if( w1._x == w2._x && w1._y == w2._y && w1._z == w2._z ) wektory_sa_rowne = 1; return wektory_sa_rowne; }
bool operator !=( const Wektor3 & w1, const Wektor3 & w2 )
{ bool wektory_nie_sa_rowne = 0; if( w1._x != w2._x || w1._y != w2._y || w1._z != w2._z ) wektory_nie_sa_rowne = 1; return wektory_nie_sa_rowne; }
int main( int argc, char * argv[] ) { Wektor3 w1( 1, 2, 3 ); Wektor3 w3, w4, w5; double ax, ay, az, k; cout << "Wektor w3 (x, y, z): "; cin >> w3; cout << "Wektor w4 (x, y, z): "; cin >> w4; cout << "Wspolczynnik k: "; cin >> k; Wektor3 w31( w3 ); cout << fixed << setprecision( 3 ) << endl; cout << "Wektor w1 = " << w1 << endl; cout << "Wektor w3 = " << w3 << endl; cout << "Kopia w3 = " << w31 << endl; cout << "Wektor w4 = " << w4 << endl << endl; w5 = w3; w5 += w4; cout << "Wektor w3+w4 = " << w5 << endl; w5 = w1 + w3; cout << "Wektor w1+w3 = " << w5 << endl << endl; w5 = w3; w5 *= k; cout << "Wektor k*w3 = " << w5 << endl; w5 = k * w4; cout << "Wektor k*w4 = " << w5 << endl; w5 = w3 * k; cout << "Wektor w3*k = " << w5 << endl << endl; cout << "Modul w3 = " << !w3 << endl; cout << "Azymut w3 = " << w3.Azym() << endl; cout << "Elewacja w3 = " << w3.Elev() << endl << endl; cout << "w3==w4 " <<(( w3 == w4 ) ? "tak" : "nie" ) << endl << endl; cout << "w3!=w4 " <<(( w3 != w4 ) ? "tak" : "nie" ) << endl << endl; return 0; }
|
|
tirou |
» 2012-11-03 20:43:26 A problemem jesT? ;0 |
|
cristiano250 Temat założony przez niniejszego użytkownika |
» 2012-11-03 20:52:46 Program nie kompiluje, zupełnie nie wiem jak zdefiniować, zadeklarować funkcje ostream/ istream i operatory >>/<< Kompilator wywala coś takiego: 'std::ostream Wektor3::operator<<(std::ostream&, Wektor3&)' must take exactly one argument| albo no match for 'operator>>' in 'std::cin >> ....'| |
|
crash |
» 2012-11-03 21:00:12 Przeładowanie operatora pobierającego dwa argumenty wewnątrz klasy wygląda inaczej w deklaracji niż przeładowanie tego operatora dwuargumentowego na zewnątrz klasy, o to chodzi kompilatorowi. |
|
DejaVu |
» 2012-11-03 21:02:42 Cóż... wypadałoby zdefiniować implementację. No ale dobrze, że dałeś cały kod, bo komunikat jest nieadekwatny do błędu w logu kompilacji :) ostream & operator <<( ostream & s, Wektor3 & w ) { return s; }
istream & operator >>( istream & s, Wektor3 & w ) { return s; }
|
|
cristiano250 Temat założony przez niniejszego użytkownika |
» 2012-11-03 21:31:00 Przeniosłem ostream operator <<(ostream& s, Wektor3& w); i istream operator >>(istream& s, Wektor3& w); do wewnatrz klasy i teraz wywala tylko to: 'std::istream Wektor3::operator>>(std::istream&, Wektor3&)' must take exactly one argument| |
|
cyklopek11 |
» 2012-11-03 21:53:14 Nie możesz przenosić do wnętrza klasy operatora>> (lub operator<<) z dwoma argumentami. DejaVu napisał ci wyżej jak to zrobić a Ty chcesz przekombinować. Jak chcesz aby zapis przeładowanego operatora z obiektami Twojej klasy był taki jak do tej pory z typami wbudowanymi: to musi on być funkcją globalną! |
|
DejaVu |
» 2012-11-03 21:53:44 Dostałeś rozwiązanie, a nie wskazówkę... |
|
« 1 » 2 3 |