Sobrecarga < < operador C ++ - Puntero a Clase
-
06-07-2019 - |
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<<'
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.