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<<'
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top