kopia obiektu w przeciążonym operatorze ++

0

Witam, część zadania brzmi:

Postfiksowy operator ++ (jako składowa klasy). (Uwaga: operator ten dla odróżnienia od wersji prefiksowej, przyjmuje „dodatkowo” tak zwany dowolny parametr int.) Działanie tego operatora powinno być podobne do operatora ++ wykonywanego na zmiennych typu int, czyli: operator powinien zwracać wartość obiektu sprzed modyfikacji. Operator ten powinien sprawdzić czy liczba wykonanych inkrementacji nie przekroczyła wartości maksLiczbaInkr. Jeśli przekroczyła to rzucony ma być wyjątek typu CWyjatek, gdzie jako wartość aktualna parametru konstruktora tej klasy przekazany zostanie napis „Maksymalna liczba inkrementacji”. W przeciwnym wypadku obiekt jest modyfikowany w następujący sposób: i) jeśli wartość pola poziomB jest mniejsze od 10, to wartość ta zwiększana jest o 1 lub ii) jeśli wartość pola poziomB jest równa 10, wówczas wartość pola poziomB ustawiana jest na 0, a wartość pola poziomA na (poziomA+1)%10. Dodatkowo wartość pola liczbaInkr zwiększana jest o 1. Operator zwraca „wartość obiektu” sprzed modyfikacji.

Natomiast to udało mi się wyklepać

 
  CPoziom(unsigned int,unsigned int, char);
    void ustawMaksInkr(int);
    CPoziom & operator ++(int dowolny){ //przeciązanie operatora ++ trzeba pamietac o "this"
        CPoziom zwracana();
        zwracana=this;

        CWyjatek wyjatek("Maksymalna liczba inkrementacji");
       if(this->liczbaInkr>this->maksLiczbaInkr)
           throw wyjatek;
       else if(this->poziomB<10) {
          this->poziomB++;
       }
       else if(this->poziomB==10){
           this->poziomB=0;
           this->poziomA=(this->poziomA+1)%10;
       }
       this->liczbaInkr++;

    return zwracana;
    }

Problem pojawia się przy zapamiętaniu początkowej wersji obiektu czyli "zwracana=this;". Chciałem tutaj użyć konstruktora kopiującego no ale cuś nie działa :/ Pytanie brzmi jak zwrócić obiekt sprzed modyfikacji.

 
1

this jest wskaźnikiem, zwracana jest obiektem, próbujesz przypisać wskaźnik do obiektu.

CWyjatek wyjatek("Maksymalna liczba inkrementacji");
if(this->liczbaInkr>this->maksLiczbaInkr)
    throw wyjatek;

Zamień to na:

if(this->liczbaInkr>this->maksLiczbaInkr)
    throw CWyjatek("Maksymalna liczba inkrementacji");

Chodzi o to, żeby tworzyć obiekt dopiero gdy jesteś pewien, że go potrzebujesz.

2
CPoziom zwracana();

Dałeś się złapać w most vexing parse: http://en.wikipedia.org/wiki/Most_vexing_parse
dla kompilatora zwracana to funkcja przyjmująca zero argumentów i zwracająca CPoziom. Rozwiązenie:

CPoziom zwracana{}; // >=C++11

ponadto:

zwracana=this;

próbujesz przypisać T* do T. Spróbuj:

zwracana = *this;

Co razem możesz skrócić do

CPoziom zwracana{*this};

lub

CPoziom zwracana = *this;

Przy okazji, gratuluję czytelności:

this->liczbaInkr>this->maksLiczbaInkr
0

Dzięki za zwrócenie uwagi na kardynalny błąd.

kq napisał(a):

Przy okazji, gratuluję czytelności:

this->liczbaInkr>this->maksLiczbaInkr

Masz może jakiś inny pomysł ?

I po co jest ten "dowolny" parametr?

1
this->liczbaInkr > this->maksLiczbaInkr

lub po prostu

liczbaInkr > maksLiczbaInkr

"Dowolny parametr" jest wyłącznie w celu utworzenia nowego przeładowania funkcji. On nie musi mieć nazwy, bo nie jest używany:

CPoziom & operator ++(int)

Przy okazji zauważyłem błąd w definicji operatora. Zwracasz kopię starego stanu, więc nie możesz zwrócić referencji. Powinno być:

CPoziom operator ++(int)

1 użytkowników online, w tym zalogowanych: 0, gości: 1