C++/Przeciążanie operatorów: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Pisarz miał za grube łapy
Lethern (dyskusja | edycje)
przeniesione do dyskusji: patrz dyskusja
Linia 347:
Operatory dekrementacji analogicznie do inkrementacji.
Należy mieć na uwadze, że przy własnych operatorach potrzebny jest "działający jak chcemy" operator= lub konstruktor kopiujący, jeśli go nie napiszemy kompilator wygeneruje go automatycznie, natomiast jeśli nasza klasa ma wewnątrz siebie wskaźniki tak w skopiowanym obiekcie będą one wskazywały na ten sam adres co wskaźniki oryginału
 
== Rzadko przeciążany operator ->* ==
Patrząc na listę operatorów możliwych do przeciążenia widzimy też ten operator, ale nie wiemy jak go przeciążyć, ani często nawet jak go użyć. Dlatego jako ciekawostkę zamieszczę te informacje.
Zacznę od normalnego działania tego operatora (bez przeciążania); jest to operator wywołujący funkcje wskazaną wskaźnikiem do funkcji wewnątrz klasy
<source lang="cpp">
#include <iostream>
using namespace std;
 
class Normalna
{
public:
void spie()
{
cout << "Jestem normalna i spie..." << endl;
}
void ideSpac()
{
cout << "Jestem normalna i ide do spanka..." << endl;
}
};
 
int main()
{
Normalna *przykladNormalnosci = new Normalna; // nalezy zwrocic uwage ze na obiekt wskazujemy wskaznikiem!!!
void (Normalna::*wskaznikDoNormalnosci)(); // utworzenia wskaźnika do składowych klasy
wskaznikDoNormalnosci = &Normalna::spie; // przypisanie mu adresu funkcji składowej klasy
(przykladNormalnosci->*wskaznikDoNormalnosci)(); // wywołanie takie jak: przykladNormalnosci->spie();
delete przykladNormalnosci;
}
</source>
 
Znając cel tego operatora nie mamy przeszkód zdefiniować go ciut inaczej niż są założenia:
 
<source lang="cpp">
#include <iostream>
using namespace std;
 
class A
{
public:
void operator->*(int a)
{
cout << "Podano liczbe: " << a << endl;
}
};
 
int main()
{
A a;
a->*4;
}
// wydruk będzie taki: Podano liczbe: 4
</source>
 
Możemy też skomplikować w jeszcze inny sposób:
 
<source lang="cpp">
#include <iostream>
using namespace std;
 
class Niezdecydowana
{
public:
int (Niezdecydowana::*niezdecydowanaFunkcja)(int i);
int operator->*(int i)
{
cout << "Wywoluje operator ->*\t";
return (this->*niezdecydowanaFunkcja)(i);
}
int razy2(int i)
{
return i*2;
}
int razy3(int i)
{
return i*3;
}
};
 
int main()
{
Niezdecydowana niezdecydowana;
niezdecydowana.niezdecydowanaFunkcja = &Niezdecydowana::razy3;
cout << "Wynik niezdecydowania: " << (niezdecydowana->*3) << endl;
}
// wydruk będzie: Wywoluje operator ->* Wynik niezdecydowania: 9
</source>