L'operatore freccia ha ingressi. Tecnicamente, può restituire quello che vuoi, ma dovrebbe restituire qualcosa che sia un puntatore o che possa diventare un puntatore through chained ->
operators.
L'operatore ->
dereferenziazioni automaticamente il suo valore di ritorno prima di chiamare il suo argomento utilizzando il built-in puntatore dereference, non operator*
, quindi si potrebbe avere la seguente classe:
class PointerToString
{
string a;
public:
class PtPtS
{
public:
PtPtS(PointerToString &s) : r(s) {}
string* operator->()
{
std::cout << "indirect arrow";
return &*r;
}
private:
PointerToString &r;
};
PointerToString(const string &s) : a(s) {}
PtPts operator->() const
{
std::cout << "arrow dereference\n";
return *this;
}
string &operator*() const
{
std::cout << "dereference\n";
return a;
}
};
utilizzarlo come:
PointerToString ptr(string("hello"));
string::size_type size = ptr->size();
che viene convertito dal compilatore in:
string::size_type size = (*ptr.operator->().operator->()).size();
(con ben .operator->()
se necessario per restituire un vero e proprio puntatore) e dovrebbe uscita
arrow dereference
indirect dereference
dereference
Si noti, tuttavia, che è possibile effettuare le seguenti operazioni:
PointerToString::PtPtS ptr2 = ptr.operator->();
Da Stroupstrup:
La trasformazione dell'oggetto p nel puntatore p.operator->()
non dipende dal membro m indicato. Questo è il senso in cui operator->()
è un operatore postfisso unario. Tuttavia, non è stata introdotta una nuova sintassi, quindi è necessario un nome membro dopo lo ->
fonte
2011-02-08 01:30:41
nessun input. Il tipo di restituzione dovrebbe essere un puntatore. Questo di solito viene usato per creare puntatori "intelligenti", quindi restituisce un puntatore all'oggetto avvolto. – Tim