Przeciążenie operatora >>
Ostatnio zmodyfikowano 2016-04-18 18:10
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. |
|
carlosmay |
» 2016-04-18 16:21:56 Przeciążanie operatorów C++Mały przykład class A { string str; public: std::istream & operator >>( std::istream & is ) { is >> this->str; return is; } std::ostream & operator <<( std::ostream & os ) { return os << this->str << std::endl; } 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() { A a; a >> std::cin; a << std::cout << std::endl; A b; std::cin >> b; std::cout << b << std::endl; } |
|
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.:
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.:
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. |
|
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 >>? |
|
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. |
|
« 1 » |