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

Przeciązenie operatora << w programownaiu obiektowym

Ostatnio zmodyfikowano 2016-03-07 00:15
Autor Wiadomość
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:
C/C++
#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.
P-145641
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.
C/C++
std::cout << x * a << std::endl; // 'x' zmienna definiowana, 'a' liczba zesplona
P-145650
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:
C/C++
ZespolonaL ZespolonaL::operator *( const ZespolonaL & zes )
{
    return ZespolonaL( Re * zes.Re - Im * zes.Im, Re * zes.Im + Im * zes.Re );
}
P-145654
« 1 »
  Strona 1 z 1