Teoretycznie mamy używać standartu C++ 98.
O matko i córko, [current year meme]. :P Tylko nie mów, że zalecali Turbo C++ jako kompilator. :P Co my, kruca fuks, w Indiach jesteśmy? ;)
Masz racje nie powinienem zwracać stringa, ale jest to też takie moje lenistwo, mogę bez pisania metody toString odczytać mój nr :P
Tak, ale to kompletnie niepraktyczne. Nagle ni z tego ni z owego zmieniasz typ - co wyklucza kaskadowe wywołania metod (a.add(b).add(c).add(d);
). Jeśli nie chcesz pisać .to_string()
możesz sobie przeładować std::ostream& operator<<(std::ostream&, const Number&)
i tam wrzucić wynik to_string()
na strumień. Potem będziesz mógł pisać std::cout << a;
i wszystko będzie cacy. ;)
A, no ale to jest przeładowanie operatora... Co za idiotyczne wymagania, przecież to część C++98. ;)
Nawet bez tego - to po prostu nie ma za bardzo sensu, żebyś stringa tam zwracał.
Co do min i max to nie do końca Cię rozumiem. Ten przykład, który przedstawiłeś będzie potrzebował tego konstruktora kopiującego czy nie? Bo jednak korzystasz tam, ze wskaźnika.
Jakiego wskaźnika? Bo patrzę, patrzę, a nie widzę. ;) min
i max
biorą referencje (do const T) i zwracają referencje (do const T). Mógłbyś to samo zrobić ze wskaźnikami, ale tutaj ich nie ma.
Jak już masz refkę do mniejszej i większej wartości - to pracujesz sobie na ich wewnętrznych stringach, zależnie jak to robisz, możesz potrzebować zrobić kopie wewnętrznych stringów jednej z wartości, albo w ogóle kopię całego obiektu za pomocą konstruktora kopiującego (dlatego pisałem, możesz i tak i tak). Po całej matematycznej magii odejmowania sprawdzasz czy *this to była mniejsza czy większa wartość i zmieniasz odpowiednio znak wyniku (jeśli to wymagane, oczywiście). W przypadku używania kopii obiektu masz od tego funkcję, jak masz tylko kopie wewnętrznych "flaków" to robisz to ręcznie. Na koniec operatorem przypisania, albo metodą assign() zmieniasz wartość *this (*this = result;
- nawet o std::move
można by się pokusić) albo zamieniasz flaki *this z flakami z wynikiem, no i zwracasz *this, tak jakby to += zrobiło.
Powiedziałbym, że jednak wygodniej będzie jak sobie zrobisz konstruktor kopiujący i operator przypisania (albo ekwiwalentną metodę).
Bo jest to trochę równoznaczne metodzie statycznej,
min
i max
w tym przykładzie to wolne funkcje. Równie dobrze możesz zdefiniować operator<, albo metodę bool is_lesser_than(const Number&)
czy jak ją tam wygodnie nazwać (wygodnie to chyba jednak operatorem, który ubiera to znaczenie w jeden rozpoznawalny znak :P) i porównać sobie nim obiekty.
Number& lesser = *this < rhs ? *this : rhs;
Number& greater = *this > rhs ? *this : rhs;
Może się zastanawiasz "zaraz, zaraz, a co jeśli są równe?" - no, ten przypadek powinieneś wyłapać na samym początku funkcji i odpowiednio zareagować. ;)
Nie widzę tu jakiegoś gwałcenia obiektowości.