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

c++ - klasy, operator przeciążony

Ostatnio zmodyfikowano 2015-06-29 21:16
Autor Wiadomość
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?

C/C++
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 ); // jesli znajdzie login zwraca true
    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()

C/C++
Tabela gracz[ rozm ];
...
gracz[ rozm - 1 ] = Tabela( login, wynik, gracz, licznik, rozm ); // dodaj gracza konstruktorem

deklaracje metod i funkcji

C/C++
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 ];
}
P-134161
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.
P-134163
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
C/C++
gracz[ rozm - 1 ] = Tabela( login, wynik, gracz, licznik, rozm );
?

To moje pierwsze podejście do klas więc i praktyki mało.
P-134165
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.
P-134167
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.
P-134169
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ć.
P-134170
« 1 »
  Strona 1 z 1