2010-05-25 3 views
5

ho visto questo codice, ma non riuscivo a capire che cosa fa:sovraccarico -> operatore in C++

inline S* O::operator->() const 
{ 
    return ses; //ses is a private member of Type S* 
} 

così che cosa succede ora se ho usato ->?

+0

BTW, questo è C++ solo perché il linguaggio C non consente la funzione né l'overloading dell'operatore. Questo è un altro problema che differenzia le due lingue. –

risposta

2

è avete un'istanza della classe O e fate

obj->func() 

poi la seconda del gestore> restituisce SES e poi si utilizza il puntatore restituito per chiamare func().

esempio completa:

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

cosa succede se il func() di S è stato dichiarato come tale: virtual void func() = 0; Le funzioni virtuali – hero

+0

dovrebbero almeno essere protette, ma preferibilmente private. È responsabilità della classe S assicurarsi che ses stia puntando a un oggetto valido. –

+0

funzioni private virtuali? A meno che tu non sia pieno di dichiarazioni di classe di amici, penso che private e virtuali si escludano a vicenda. – luiscubal

0

È un operatore sovraccarico che restituisce un puntatore a un membro di tipo S.

Come, se si scrive

O object; 
(object->)... 

parte (object->) sarebbe diventato il puntatore.

-1

sovraccarica l'operatore -> della classe O, che restituisce ora una S * al posto di un O *

+3

Per impostazione predefinita, la classe O non ha un operatore -> che restituisce un O *. –

0

Ogni volta che un oggetto di tipo O usa l'operatore -> un puntatore a SES verrà restituito.

11

Ora, se avete

O object; 
object->whatever() 

prima il sovraccarico operator-> sarà chiamato, che restituirà ses memorizzati all'interno dell'oggetto, quindi operator-> (built-in in caso di S*) verrà richiamato per il puntatore restituito.

Così

object->whatever(); 

è equivalente a pseudocodice:

object.ses->whatever(); 

quest'ultimo sarebbe ovviamente impossibile, poiché O::ses è private - è per questo io lo chiamo pseudocodice.

Con tale sovraccarico è possibile creare un wrapper attorno a un puntatore: tale wrapper viene in genere chiamato puntatore intelligente .

+0

"Con suce overload" => Intendevi "tale" o "suce" il nome dell'operatore '->'? (chiedono non madrelingua inglese) – ereOn

+0

@ereOn: corretto, erano errori di battitura. – sharptooth