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

Klasa trio - codereview

Ostatnio zmodyfikowano 2014-01-05 14:09
Autor Wiadomość
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 :)
C/C++
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 );
    }
};
P-101202
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.
P-101207
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ą.
P-101209
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/hFmpXrBS

Mam 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. "
P-101215
pekfos
» 2014-01-05 13:06:13
C/C++
trio( T1 first, T2 second, T3 third )
    : first( first )
    , second( second )
    , third( third )
{ }
P-101218
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 )
P-101219
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?
P-101220
Monika90
» 2014-01-05 13:25:38
Sądzę, że możesz użyć
* this
P-101221
« 1 » 2
  Strona 1 z 2 Następna strona