Sovraccarico < < operatore C ++ - Puntatore alla classe
-
06-07-2019 - |
Domanda
class logger {
....
};
logger& operator<<(logger& log, const std::string& str)
{
cout << "My Log: " << str << endl;
return log;
}
logger log;
log << "Lexicon Starting";
Funziona bene, ma vorrei usare invece un puntatore a un'istanza di classe. cioè.
logger * log = new log();
log << "Lexicon Starting";
È possibile? In tal caso, qual è la sintassi? Grazie
Modifica: l'errore del compilatore è
error: invalid operands of types 'logger*' and 'const char [17]' to binary 'operator<<'
Soluzione
Dovresti dereferenziare il puntatore al tuo oggetto logger e ovviamente controllare se non è 0. Qualcosa del genere dovrebbe fare il lavoro:
log && ((*log) << "Lexicon starting")
A parte il generale, eviterei di fare riferimento a oggetti come un logger (che normalmente ti aspetti incondizionatamente di essere presente) tramite un puntatore a causa dell'incertezza che ottieni con un puntatore, AKA c'è un oggetto o no?
Altri suggerimenti
Ecco il modo:
logger * log = new log();
(*log) << "Lexicon Starting";
Perché non usare un riferimento?
logger & log = *(new log());
// the above is abhorrent code that
// should be replaced by something meaningful
log << "Lexicon Starting";
se questo non è quello che vuoi, andrei con Timo Geusch , anche se è brutto
A seconda del contesto da cui si ottiene il logger, è possibile che si desideri restituire un riferimento anziché un puntatore:
...
Logger& logger() {
return *_pLogger;
}
...
Logger& log = logger();
log << "...";
Non proprio. new log ()
ha il tipo di puntatore, " Lexicon iniziale "
ha il tipo const char [16]
. Puoi sovraccaricare gli operatori solo se almeno un argomento ha un tipo definito dall'utente.
decasteljau ha correttamente osservato che è possibile farlo tramite (* log)
, se si desidera il puntatore. Non mi piace il puntatore, tuttavia. Andrei Alexandrescu dedica un bel po 'di pagine sui singoli log di smart logger in "Modern C ++ Design", potrebbe valere la pena di consultarlo.