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 ->
?
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 ->
?
è 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;
}
cosa succede se il func() di S è stato dichiarato come tale: virtual void func() = 0; Le funzioni virtuali – hero
dovrebbero almeno essere protette, ma preferibilmente private. È responsabilità della classe S assicurarsi che ses stia puntando a un oggetto valido. –
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
È 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.
sovraccarica l'operatore -> della classe O, che restituisce ora una S * al posto di un O *
Per impostazione predefinita, la classe O non ha un operatore -> che restituisce un O *. –
Ogni volta che un oggetto di tipo O usa l'operatore -> un puntatore a SES verrà restituito.
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 .
"Con suce overload" => Intendevi "tale" o "suce" il nome dell'operatore '->'? (chiedono non madrelingua inglese) – ereOn
@ereOn: corretto, erano errori di battitura. – sharptooth
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. –