pingwindyktator Temat założony przez niniejszego użytkownika |
Klasa trio - codereview » 2014-01-05 12:05:56 Stosunkowo niedawno zacząłem przerabiac programowanie obiektowe. Napisałem klase, ktora trzyma 3 wartosci - wzorowałem się na std::pair. Wydaje mi się, ze wszystko jest mniej-więcej okej, jednak licze na jakąs konstruktywną krytyke z waszej strony :) template < class T1, class T2, class T3 > class trio { public: T1 first; T2 second; T3 third; void make_trio( T1 first, T2 second, T3 third ) { trio::first = first; trio::second = second; trio::third = third; } trio( T1 first, T2 second, T3 third ) { make_trio( first, second, third ); } trio() { } trio( trio & a ) { first = a.first; second = a.second; third = a.third; } void swap( trio a ) { ::swap( first, a.first ); ::swap( second, a.second ); ::swap( third, a.third ); } void operator =( trio a ) { first = a.first; second = a.second; third = a.third; } bool operator ==( trio b ) { return( first == b.first && second == b.second && third == b.third ); } bool operator !=( trio b ) { return( first != b.first || second != b.second || third != b.third ); } bool operator <( trio a ) { if( first == a.first ) { if( second == a.second ) return( third < a.third ); return( second < a.second ); } return( first < a.first ); } bool operator >( trio a ) { if( first == a.first ) { if( second == a.second ) return( third > a.third ); return( second > a.second ); } return( first > a.first ); } bool operator <=( trio a ) { return( trio < T1, T2, T3 >( first, second, third ) < a || trio < T1, T2, T3 >( first, second, third ) == a ); } bool operator >=( trio a ) { return( trio < T1, T2, T3 >( first, second, third ) > a || trio < T1, T2, T3 >( first, second, third ) == a ); } };
|
|
Monika90 |
» 2014-01-05 12:27:57 licze na jakąs konstruktywną krytyke |
Wedle życzenia... 1. Argument konstruktora kopiującego powinenen być typu const trio& - bez tego nie będziesz mógł kopiować r-wartości. Najlepiej w ogóle go usuń, kompilator zrobi go za ciebie. 2. operator = powinien zwracać referencję do *this, a najlepiej usuń go w ogóle. 3. swap zamienia wartość bieżacego obiektu z lokalną kopią argumentu - chyba nie o to chodziło? Poza tym, działa tylko wtedy gdy dostępna jest globalna funkcja o nazwie swap. Powinieneś użyć std::swap i wywoływać je tak: using std::swap; swap( first, a.first ); 4. Operatory != > >= <= najlepiej zdefiniować za pomocą == i <, na dodatek u ciebie <= i >= tworzą niepotrzebne kopie obiektów. Wszystkim tym operatorom brakuje atrybutu const, ale chyba i tak najlepiej nie definiować ich jako składowych klasy. |
|
pekfos |
» 2014-01-05 12:36:34 Jeśli konstruktory zostawisz, powinieneś tam użyć listy inicjalizacyjnej, zamiast przypisań. W przypadku std::pair<>, make_pair() jest oddzielną funkcją zwracającą parę, a nie metodą. |
|
pingwindyktator Temat założony przez niniejszego użytkownika |
» 2014-01-05 12:57:03 Właśnie nie byłem do końca pewien, czy te funkcje robią lokalne kopie, cz nie. Co do operator=. Zupełnie nie mam pomysłu, jak napisać to zwracając this. Po poprawkach: http://pastebin.com/hFmpXrBSMam błąd kompilacji i nie wiem, jak to naprawić. błąd:no type named 'first' in 'class trio<int, int, char>' trio(T1 first, T2 second, T3 third) : trio::first(first), trio::second(second), trio::third(third) {} Nie do końca rozumiem też "Operatory != > >= <= najlepiej zdefiniować za pomocą == i <, na dodatek u ciebie <= i >= tworzą niepotrzebne kopie obiektów. " |
|
pekfos |
» 2014-01-05 13:06:13 trio( T1 first, T2 second, T3 third ) : first( first ) , second( second ) , third( third ) { }
|
|
Monika90 |
» 2014-01-05 13:17:26 Operatory != > >= <= najlepiej zdefiniować za pomocą == i < |
a != b to samo co !( a == b ) a > b to samo co b < a a <= b to samo co !( b < a ) a >= b to samo co !( a < b ) |
|
pingwindyktator Temat założony przez niniejszego użytkownika |
» 2014-01-05 13:24:02 Okej, rozumiem. Jeszcze jedno pytanie. Czy muszę w tych operatorach używać trio < T1, T2, T3 >( first, second, third ) czyli właśnie - tej lokalnej kopii, czy można rozwiązac to inaczej? |
|
Monika90 |
» 2014-01-05 13:25:38 Sądzę, że możesz użyć * this |
|
« 1 » 2 |