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 |