Przeładowanie operatora - odwrotność

0

Mam być może głupie pytanie, ale mam klasę, której obiekt może być "aktywny" lub nie.
Zastanawiam się, czy jest możliwość, by obiekt zwrócił informację o swoim stanie w instrukcji if?
Przykładowo mogę przeładować operator !, który zwróci wynik true lub false w zależności od stanu. Wówczas mogę zrobić tak:

if(!obiekt){...}

Natomiast zastanawiam się, czy jest możliwość, by zrobić zapis typu:

if(obiekt){...}

Tj. by obiekt zwrócił "samoczynnie" zwrócił swój stan? - w końcu przy takim zapisie nie korzystamy z żadnego operatora...

Z góry dzięki za rozjaśnienie problemu ;-)

0

Btw. Używanie operatora bool w C++03 jest troszkę "popsute". Ponieważ bool może być niejawnie konwertowany na liczbę, dozwolone jest robienie różnych dziwnych rzeczy. Jeżeli klasa X ma zaimplementowany X::operator bool() const; i x jest typu X to można zrobić np. int bez_sensu = x + 100; i wszystko będzie ok (http://ideone.com/tyGSs0).

Są różne możliwości rozwiązania tego problemu: zaimplementowanie operatora !, operatora void *, bardziej "obiektowe" rozwiązania - tak dochodzimy do safe bool idiom. O tej drodze możesz poczytać tutaj: http://www.artima.com/cppsource/safebool.html

W C++11 problem ten został całkowicie rozwiązany przez wprowadzenie możliwości określania operatorów konwersji jako explicit. Oznacza to, że operator nie może być użyty w niejawnych konwersjach: http://ideone.com/G8VLfy (Konwersja wymagana w kontekście "logicznym" jest uznawana za konwersję jawną)

0

Wow, genialne! Dzięki Panowie!!!
Tak czytam sobie książkę symfonia i tam nie było podanego operatora bool ;-) - a tu proszę... ;D
Superowo! Jeszcze raz dzięki! :-)

0

Hey, mam jeszcze jedną prośbę o wyjaśnienie pewnej rzeczy.
Na podanej przez n0name-a stronie wikipedii na samym końcu jest przykład do zbudowania post i pre inkrementacji. Wygląda to następująco:

class Foo {
  int i;
public:
  Foo(int j): i(j) {}
 
  Foo & operator++() { // preinkrementacje, czyli najpierw  zwiększamy a potem zwracamy
    ++i;
    return *this;
  }
  Foo operator++(int) {  // specjalny zapis do postinkrementacji
    Foo kopia = (*this);
    ++i;
    return kopia; // zwracamy kopię, a nie oryginał
  }
};

Moje pytanie brzmi: dlaczego dla postinkrementacji jako parametr funkcji jest int - co on robi i jak go należy interpretować?
Skąd program wie, którą funkcję wykorzystać gdy robię: ++obiekt lub obiekt++?

0
  1. int - bo tak.
  2. nic nie robi, nie należy go interpretować to jedynie znacznik ze operacja jest przyrostkowa (nijako dwuargumentowa)
  3. przyrostkowa (obiekt++) ma dodatkowy parametr int
0
_13th_Dragon napisał(a):

int - bo tak.

  1. nic nie robi, nie należy go interpretować to jedynie znacznik ze operacja jest przyrostkowa (nijako dwuargumentowa)
  2. przyrostkowa (obiekt++) ma dodatkowy parametr int

Po wiem szczerze, że nie za bardzo to rozumiem.
W końcu zarówno ++obiekt jak i obiekt++ wywołujemy bez podawania żadnych argumentów więc skąd kompilator ma wiedzieć którą funkcję wywołać? :/
Po drugie jeśli funkcja jest dwuargumentowa to chyba powinienem móc zrobić coś w stylu obiekt++2; mimo, że ta 2 nie będzie nigdzie wykorzystana. A mimo wszystko nie mogę tak napisać...

1
  1. Wlasnie po to jest to "int", zeby kompilator mogl je rozroznic jakos.
  2. To jest C++ tu nie ma miejsca na logike jakakolwiek...

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