Pregunta

class logger {
 ....
};

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

logger log;
log << "Lexicon Starting";

Funciona bien, pero me gustaría usar un puntero a una instancia de clase en su lugar. es decir,

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

¿Es esto posible? Si es así, ¿cuál es la sintaxis? Gracias

Editar: el error del compilador es

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

Solución

Tendría que desreferir el puntero al objeto del registrador y, obviamente, verificar si no es 0. Algo como esto debería hacer el trabajo:


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

Dejando de lado, me gustaría evitar hacer referencia a objetos como un registrador (que normalmente se espera que esté presente incondicionalmente) a través de un puntero debido a la incertidumbre que se obtiene con un puntero, AKA, ¿existe un objeto o no?

Otros consejos

Aquí está el camino:

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

¿Por qué no usar una referencia?

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

log << "Lexicon Starting";

si esto no es lo que quieres, iría con Timo Geusch , incluso si es feo

Dependiendo del contexto en el que obtenga su registrador, es posible que desee devolver una referencia en lugar de un puntero:

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

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

En realidad no. new log () tiene un tipo de puntero, " El inicio del léxico " tiene el tipo const char [16] . Solo puede sobrecargar los operadores si al menos un argumento tiene un tipo definido por el usuario.

decasteljau comentó correctamente que puedes hacer esto a través de (* log) , si quisieras el puntero. No me gusta el puntero, sin embargo. Andrei Alexandrescu dedica bastantes páginas a singletons de registradores inteligentes en "Modern C ++ Design", podría valer la pena consultarlos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top