Przeciązenie operatora << w programownaiu obiektowym
Ostatnio zmodyfikowano 2016-03-07 00:15
jakubby Temat założony przez niniejszego użytkownika |
Przeciązenie operatora << w programownaiu obiektowym » 2016-03-06 16:47:28 Witam! Dopiero zaczynam swoja przygodę z programowaniem obiektowym i natknąłem się na pewną sytuacje, której nie potrafie wytłumaczyć. Oto CZĘŚĆ mojego kodu: #include <iostream> using std::ostream; using std::istream; class ZespolonaL { private: double Re; double Im; public: ZespolonaL( double R = 0, double I = 0 ); ~ZespolonaL(); ZespolonaL operator +( const ZespolonaL & ); ZespolonaL operator -( const ZespolonaL & ); ZespolonaL operator *( const ZespolonaL & ); friend ZespolonaL operator *( double r, const ZespolonaL & ); friend ZespolonaL operator ~( const ZespolonaL & ); friend istream & operator >>( istream & is, ZespolonaL & ); friend ostream & operator <<( ostream & os, const ZespolonaL & zes ); };
ZespolonaL::ZespolonaL( double R, double I ) { Re = R; Im = I; } ZespolonaL operator *( double r, const ZespolonaL & zes ) { return ZespolonaL( zes.Re * r, zes.Im * r ); } istream & operator >>( istream & is, ZespolonaL & zes ) { is >> zes.Re; is >> zes.Im; std::cin.get(); return is; } ostream & operator <<( ostream & os, const ZespolonaL & zes ) { os << zes.Re; if( zes.Im >= 0 ) os << '+'; os << zes.Im << 'i'; return os; }
A oto opis problemu: funkcja int main() to prosciutka funkcja która tylko i wylacznie testuje dzialanie programu metod/konstruktora/funkcji . Początkowo przy przeciazeniu operator '<<' drugi argument deklarowalem jako ZespolonaL &zes (bez const!) i w takim przypadku kompilator wyrzucał ogromną liczbę błedów, jeżeli dobrze rozumiałem np. przy wyrażeniu "cout << a*b" (gdzie a,b to liczby zespolone) lub tez "cout << 2*c" traktował on te liczby zepsolone jak zwykłe "chary". Byłbym wdzięczny gdyby ktoś sprobował mi wytłumaczyć dlaczego tak sie dzieje. Z góry dzieki za pomoc. |
|
carlosmay |
» 2016-03-06 23:03:42 przy wyrażeniu "cout << a*b" |
Dla takiego wyrażenia nie ma zdefiniowanej funkcji składowej w podanym przykładzie. Takie wyrażenie u mnie działa. std::cout << x * a << std::endl;
|
|
jakubby Temat założony przez niniejszego użytkownika |
» 2016-03-07 00:15:45 Tzn. oczywiście w głownym pliku z funcka main znajduje się deklaracja "using std::cout" i wydawało mi się ,że jeżeli napisze "cout << a*b" to na początku zostanie uruchomiona "metoda a.operator*(b)" , zwróci ZespolonaL i zostanie uruchomiona funkcja zaprzyjazniona "operator<<(cout,a.operator*(b))". Przepraszam,faktycznie nie wrzucilem do pierwszego postu odpowiedniej funckji... (Starałem się wrzucić jedynie to co mogło miec coś wspolnego z problemem.) Oczywiscie istnieje rownież metoda: ZespolonaL ZespolonaL::operator *( const ZespolonaL & zes ) { return ZespolonaL( Re * zes.Re - Im * zes.Im, Re * zes.Im + Im * zes.Re ); }
|
|
« 1 » |