carlosmay Temat założony przez niniejszego użytkownika |
c++ - klasy, operator przeciążony » 2015-06-29 20:12:37 Kombinowałem przy kopiowaniu obiektów z tablicy Tabela gracz[rozm]. Niestety nie kopiowało przy sortowaniu elementów. Przeciążyłem operator= i od tej pory nie działa w main() konstruktor dodający gracza. Moje pytanie: czy nawaliłem baboli przy przeciążaniu, czy od tej pory nie da się korzystać z operatora = dla konstruktora i muszę napisać dodatkową metodę dodającą kolejnych graczy? class Tabela { private: string _login; short _wyniki[ rozm_wyn ]; friend void sortuj( Tabela tab[], const int & licz, const short & n ); bool operator >( Tabela & t ); void operator =( const Tabela & t ); public: Tabela(); Tabela( const string & log, const short & wyn, Tabela tab[], const int & licz, const short & n ); ~Tabela(); void aktualizacja( const short & wyn, Tabela tab[], const int & licz, const short & n ); bool sprawdz_login( const string & log ); void show_jednego() const; friend void show_najlepsze( const Tabela tab[], const int & licz, const short & n ); friend void show_wszystkie( const Tabela tab[], const int & licz, const short & n ); friend void show_lista( const Tabela tab[], const int & licz, const short & n ); };
main() Tabela gracz[ rozm ]; ... gracz[ rozm - 1 ] = Tabela( login, wynik, gracz, licznik, rozm );
deklaracje metod i funkcji Tabela::Tabela() { _login = "Emp"; for( int i = 0; i < rozm_wyn; ++i ) _wyniki[ i ] = 0; }
Tabela::Tabela( const string & log, const short & wyn, Tabela tab[], const int & licz, const short & n ) { _login = log; _wyniki[ 0 ] = wyn; _wyniki[ 1 ] = _wyniki[ 2 ] = 0; sortuj( tab, licz, n ); }
Tabela::~Tabela() { }
void sortuj( Tabela tab[], const int & licz, const short & n ) { if( licz == 0 ) tab[ 0 ] = tab[ n - 1 ]; Tabela tymczas = tab[ n - 1 ]; short i; for( i = 0; i < n; ++i ) if( tymczas > tab[ i ] ) break; short j; for( j = n - 1; j > i; --i ) tab[ j ] = tab[ j - 1 ]; tab[ j ] = tymczas; }
bool Tabela::operator >( Tabela & t ) { if( this->_wyniki[ 0 ] > t._wyniki[ 0 ] ) return true; else return false; }
void Tabela::operator =( const Tabela & t ) { this->_login = t._login; this->_wyniki[ 0 ] = t._wyniki[ 0 ]; }
|
|
Monika90 |
» 2015-06-29 20:22:14 Nie musisz definiować opratora = dla klasy która ma tylko takie składowe string _login; short _wyniki[ rozm_wyn ]; , bo kompilator zrobi to za Ciebie i to na dodatek poprawnie. |
|
carlosmay Temat założony przez niniejszego użytkownika |
» 2015-06-29 20:35:44 Ok. Pokombinuję bo może pomieszałem coś z indeksami wcześniej i nie wychodziło. A odnośnie pytania, o ten konstruktor: czy jak zdefiniuję operator = to już nie da się skorzystać w ten sposób z konstruktora gracz[ rozm - 1 ] = Tabela( login, wynik, gracz, licznik, rozm );
? To moje pierwsze podejście do klas więc i praktyki mało. |
|
Monika90 |
» 2015-06-29 20:40:35 Da się, pod warunkiem, że operator = jest poprawny. Twój nie jest, bo kopiuje tylko pierwszy element tablicy. Poza tym, przyjęło się z operatora = zwracać *this. |
|
carlosmay Temat założony przez niniejszego użytkownika |
» 2015-06-29 21:03:52 Założyłem tak: Tablica ma 11 elementów. Dziesięć jest wyświetlanych na różne sposoby, a do jedenastego "roboczego" zapisuje wynik obecnego gracza. Zapisuje dane za pomocą konstruktora do 11, a konstruktor po wpisaniu danych ma posortować tablicę wg wysokości wyników, _wyniki[0].
Elem 11 zapisuje się prawidłowo bo po wyświetleniu wszystkiego jest na ostatnim miejscu.
Teraz w funkcji sortuj przypisuje do tab[0] = tab[n - 1] - czyli ostatni poprawnie zapisany. Po wyświetlaniu nadal tab[0] ma dane początkowe, nic nie skopiowane. Ale jadąc krok po kroku z debugerem zauważyłem, że kopiuje z pustego do pustego. Musi być źle przekazana tablica do sortowania. |
|
carlosmay Temat założony przez niniejszego użytkownika |
» 2015-06-29 21:16:11 Wyciągnąłem sortowanie do sekcji publicznej i wywołuję z main() i zaczęło działać poprawnie. Jeszcze muczę dużo się nauczyć.
|
|
« 1 » |