Pergunta

class logger {
 ....
};

logger& operator<<(logger& log, const std::string& str)
{
    cout << "My Log: " << str << endl;
    return log;
}

logger log;
log << "Lexicon Starting";

funciona bem, mas eu gostaria de usar um ponteiro para uma instância de classe em vez disso. i.

logger * log = new log();
log << "Lexicon Starting";

Isso é possível? Se assim o que é a sintaxe? Graças

Edit: O erro do compilador é

error: invalid operands of types 'logger*' and 'const char [17]' to binary 'operator<<'
Foi útil?

Solução

Você teria que excluir a referência o ponteiro para o objeto logger e, obviamente, verificar se não é 0. Algo como isso deve fazer o trabalho:


  log && ((*log) << "Lexicon starting")

Como um general de lado, eu iria fugir de objetos que fazem referência como um logger (que você normalmente incondicionalmente esperar para estar presente) através de um ponteiro, devido à incerteza que você começa com um ponteiro, AKA existe um objeto ou não?

Outras dicas

Aqui é o caminho:

logger * log = new log();
(*log) << "Lexicon Starting";

Por que não usar uma referência?

logger & log = *(new log()); 
// the above is abhorrent code that 
// should be replaced by something meaningful

log << "Lexicon Starting";

Se isto não é o que você quer que eu vá com Timo Geusch , mesmo se ele é feio

Dependendo do contexto em que você começa o seu logger de, você pode querer retornar uma referência em vez de um ponteiro:

...
Logger& logger() {
    return *_pLogger;
}
...

Logger& log = logger();
log << "...";

Não é verdade. new log( ) tem tipo de ponteiro, "Lexicon starting" tem tipo const char[16]. Você só pode operadores sobrecarga se pelo menos um argumento tem um tipo definido pelo usuário.

decasteljau corretamente observou que você poderia fazer isso via (*log), se você quisesse o ponteiro. Eu não gosto do ponteiro, no entanto. Andrei Alexandrescu dedica algumas páginas singletons logger inteligentes no "Projeto ++ Modern C", pode valer a pena consultar isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top