2010-05-25 16 views
5

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?

+0

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. –

Antwort

2

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; 
} 
+1

Was passiert, wenn die Funktion func() von S als solche deklariert wurde: virtual void func() = 0; – hero

+0

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. –

+0

virtuelle private Funktionen? Es sei denn, Sie sind voll von Klassenerklärungen, ich denke, privat und virtuell schließen sich gegenseitig aus. – luiscubal

0

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.

-1

Es überlädt den Operator -> der Klasse OS, das nun eine S * statt ein O * gibt

+3

Standardmäßig hat die Klasse O keinen -> -Operator, der ein O * zurückgibt. –

0

Immer wenn ein Objekt vom Typ O verwendet den Operator -> ein Zeiger auf ses zurückgegeben wird.

11

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.

+0

"Mit suce überladen" => Haben Sie "so" gemeint oder ist "suce" der Name des '->' Operators? (Nicht Muttersprachler fragt) – ereOn

+0

@ereOn: Behoben, das waren Tippfehler. – sharptooth