ich diesen Code sah aber ich konnte nicht verstehen, was es tut:Überlastung -> Operator in C++
inline S* O::operator->() const
{
return ses; //ses is a private member of Type S*
}
so was passiert, wenn ich jetzt ->
verwendet?
ich diesen Code sah aber ich konnte nicht verstehen, was es tut:Überlastung -> Operator in C++
inline S* O::operator->() const
{
return ses; //ses is a private member of Type S*
}
so was passiert, wenn ich jetzt ->
verwendet?
Ist Sie eine Instanz der Klasse O haben, und Sie tun
obj->func()
dann die betreiber> liefert ses und dann verwendet er die zurückgegebene Zeiger func() aufzurufen.
Voll Beispiel:
struct S
{
void func() {}
};
class O
{
public:
inline S* operator->() const;
private:
S* ses;
};
inline S* O::operator->() const
{
return ses;
}
int main()
{
O object;
object->func();
return 0;
}
Was passiert, wenn die Funktion func() von S als solche deklariert wurde: virtual void func() = 0; – hero
virtuelle Funktionen sollten zumindest geschützt werden, aber vorzugsweise privat. Es liegt in der Verantwortung der Klasse S sicherzustellen, dass ses auf ein gültiges Objekt zeigt. –
virtuelle private Funktionen? Es sei denn, Sie sind voll von Klassenerklärungen, ich denke, privat und virtuell schließen sich gegenseitig aus. – luiscubal
Es ist ein überladener Operator, der einen Zeiger auf ein Element vom Typ S
zurückgeben würde.
Wie, wenn Sie
O object;
(object->)...
den Teil schreiben (object->)
würde der Zeiger werden.
Es überlädt den Operator -> der Klasse OS, das nun eine S * statt ein O * gibt
Standardmäßig hat die Klasse O keinen -> -Operator, der ein O * zurückgibt. –
Immer wenn ein Objekt vom Typ O verwendet den Operator -> ein Zeiger auf ses zurückgegeben wird.
Nun, wenn Sie
O object;
object->whatever()
haben zuerst die überladenen operator->
wird aufgerufen, die ses
im Objekt gespeichert zurückkehren, dann operator->
(built-in im Fall von S*
) wird erneut für den zurückgegebenen Zeiger aufgerufen.
So
object->whatever();
entspricht Pseudo-Code:
object.ses->whatever();
letztere natürlich unmöglich, da O::ses
ist private
wäre - das ist, warum ich es Pseudo-Code nennen.
Mit einer solchen Überladung können Sie einen Wrapper um einen Zeiger erstellen - ein solcher Wrapper wird normalerweise Smart-Zeiger genannt.
"Mit suce überladen" => Haben Sie "so" gemeint oder ist "suce" der Name des '->' Operators? (Nicht Muttersprachler fragt) – ereOn
@ereOn: Behoben, das waren Tippfehler. – sharptooth
BTW, das ist C++ nur, da die Sprache C weder Funktion noch Operatorüberladung erlaubt. Dies ist ein weiteres Problem, das die beiden Sprachen unterscheidet. –