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

Przeciążenie operatora >>

Ostatnio zmodyfikowano 2016-04-18 18:10
Autor Wiadomość
pepe450
Temat założony przez niniejszego użytkownika
Przeciążenie operatora >>
» 2016-04-18 15:10:24
Witam mam problem z zadaniem domowym, a dokładnie z przeciążeniem operatora>> mam zmodyfikować wprowadzanie nowych obiektów do mojej tablicy tak aby korzystać z operatora>>. Niestety nie wiem jak się do tego zabrać aby zastąpić moje aktualne dodawanie obiektów nowym.
Mój obecny kod wygląda tak:
https://gist.github.com/anonymous/004c5329783b86be6349d12d57d3b748

Polecenie natomiast jest następujące:
Zaimplementuj przeciążenie operatora>>, które będzie pełniło funkcję dodawania nowych figur do bazy.
Deklaracja tej metody może mieć następującą postać:
BazaFigur & operator>>(Figura & figura)

Prosił bym o jakieś wskazówki.
P-147388
carlosmay
» 2016-04-18 16:21:56
Przeciążanie operatorów C++

Mały przykład
C/C++
class A {
    string str;
public:
    // wersja  nieintuicyjna
    std::istream & operator >>( std::istream & is ) {
        is >> this->str;
        return is;
    }
   
    std::ostream & operator <<( std::ostream & os ) {
        return os << this->str << std::endl;
    }
   
    // wersja intuicyjna (funkcje zaprzyjaźnione)
    friend std::istream & operator >>( std::istream & is, A & a ) {
        return is >> a.str;
    }
   
    friend std::ostream & operator <<( std::ostream & os, A & a ) {
        return os << a.str;
    }
};

int main()
{
    // to rozwiązanie jest niepraktyczne i nieintuicyjne, ale działa
    // obiekt klasy musi być po lewej stronie
    A a;
    a >> std::cin;
    a << std::cout << std::endl;
   
    // tak jest poprawnie i intuicyjnie
    A b;
    std::cin >> b;
    std::cout << b << std::endl;
}
P-147391
michal11
» 2016-04-18 17:10:17
@up nie chodzi o operator do wczytywania ze strumienia tylko dodawania do .

Czy to ty robiłeś ten program ? Ty to zaprojektowałeś, czy dostałeś gotowy kod i masz tylko dopisać do niego operator>> ?

W obecnej formie taka deklaracja
BazaFigur & operator >>( Figura & figura )
 nie za dużo ci da bo masz moim zdaniem zły design klas, jedyna możliwość żeby napisać tylko jeden operator>> z argumentem Figura &[/ctt] to trzeba by było sprawdzać w nim jaki faktycznie obiekt jest pod ta referencją, czyli jeden wilki if i castowanie, zdecydowanie tego NIE polecam a wręcz odradzam, jest to generalnie zła praktyka no ale zadziałało by bez zmiany klas itp.

Jeżeli twój operator nie musi wyglądać tak:
BazaFigur & operator >>( Figura & figura )
 i nie chcesz lub nie możesz zmienić reszty klas to dodaj po prostu kilka takich operatorów dla każdego typu (również słabe podejście ale lepsze od poprzedniego), np.:
C/C++
BazaFigur & operator >>( Elipsa & elipsa );
BazaFigur & operator >>( Kolo & kolo );
BazaFigur & operator >>( Prostokat & prostokat )
//...

i wywołuj w każdym z nich tylko metodę odpowiednią dla każdej figury.

Jeżeli natomiast chcesz to zrobić dobrze i możesz zmienić kod to możesz na przykład dodać funkcję wirtualną dla Figury
Figura * makeCopy() = 0;
I wtedy dla każdej klasy musisz ją zaimplementować tworząc w niej już konkretny obiekt klasy i zwracając go w tej funkcji np.:
C/C++
Figura * Elipsa::makeCopy()
{
    Figura * kopia = new Elipsa( a, b, name );
    return kopia;
}

Nie mówię już o skorzystaniu z c++11, vector, smart pointer itp.
P-147394
pepe450
Temat założony przez niniejszego użytkownika
» 2016-04-18 17:32:33
Tak to mój kod pisałem go do poprzednich zadań.
Czyli proponujesz żebym stworzył metodę która będzie zwracać mi gotowy obiekt i ten gotowiec dodawać za pomocą >>?
Dobrze zrozumiałem ?
Dzięki za każdą radę.

I co wtedy powinno być zwracane w ciele operatora >>?
P-147397
michal11
» 2016-04-18 18:10:59
Tak będzie pewnie najprościej, pamiętaj tylko o poprawnym zwalnianiu pamięci.

Operator>> powinien zwracać *this tak aby możliwe było kaskadowe wywoływanie tego operatora.
P-147399
« 1 »
  Strona 1 z 1