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

[c++] Jak wywołać przeładowanie operatora, z klasy dziedziczonej na obiekcie klasy bazowej

Ostatnio zmodyfikowano 2021-08-25 19:05
Autor Wiadomość
00Andre
Temat założony przez niniejszego użytkownika
[c++] Jak wywołać przeładowanie operatora, z klasy dziedziczonej na obiekcie klasy bazowej
» 2021-08-24 18:38:51
Witam

Mam problem z wywołaniem przeładowanie operatora.

C/C++
#include <iostream>
#include <string>

class a
{
private:
   
int val;
   
public:
   
a() { };
   
   
void operator +( unsigned dd ) { val += dd; };
   
   
~a() { };
};

class b
    : public a
{
private:
   
std::string valstr;
public:
   
b() { };
   
   
// W KLASIE BAZOWEJ MOŻNA ZA POMOCA
    // a::operator+(5); TO DZIAŁA U MNIE
   
   
void operator +( std::string rr ) { valstr = rr; };
   
   
~b() { };
};

int main()
{
   
b element_b;
   
   
element_b + 5; // <- tutaj blad, jak ustwic, aby było widać przeciążenie operatora z klasy a
   
   
return 0;
}
P-178872
DejaVu
» 2021-08-24 19:13:52
P-178873
00Andre
Temat założony przez niniejszego użytkownika
» 2021-08-24 19:32:29
Wiem jak działa główne przeładowanie operatora+
w tym linku nie wyjaśnienia problemu mojego.

Musze mieć dwie klasy, jedna klasa ją dziedziczy i musi być tam przeładowanie operatora
i musi być używany z klasy bazowej tak jak pokazałem w main.

Jak jest jedno przeładowanie operatora+ działa wszystko ok, ale jeśli są dwa przeładowania operatora+ w klasie bazowej b i dziedziczonej a to jest problem. nawet typedef nie pomaga, ponieważ kompilator nie widzi przeładowania operatora+ z klasy a

i jak oznaczyć aby kompilator wiedział o jakie chodzi przeładowanie operatora
P-178874
DejaVu
» 2021-08-24 19:34:55
Dopisz do klasy 'b':
C/C++
void operator +( unsigned dd ) { a::operator +( dd ); };

/edit:
1. Typedef nie ma znaczenia (to po prostu bardziej zgeneralizowany przykład przeciążenia operatora)
2. Jeżeli Twój operator nie zwraca żadnego typu to de-facto wynik działania niczego nie zmienia, więc... mimo wszystko źle przeciążasz operator dodawania.

/edit:
A jeżeli użycie operatora + powoduje modyfikację stanu obiektu po 'lewej' to z góry prosisz się o kłopoty, bo kod będzie zachowywał się nieintuicyjnie.

Przykład:
C/C++
a = 0;
a + 1;
a + 2;
cout << a; //u Ciebie wyjdzie 3, a logicznie powinno być 0.

Tak więc rozsądniej byłoby użyć operatora +=, aby poprawnie odzwierciedlić Twoje intencje LUB poprawnie zaimplementować operator dodawania.
P-178875
pekfos
» 2021-08-25 19:05:55
Ten operator w b jest ukryty, bo masz zadeklarowany drugi, chociaż z innymi argumentami. Żeby wciągnąć wersję z a, dopisz do klasy b:
C/C++
using a::operator +;
P-178884
« 1 »
  Strona 1 z 1