Surcharge < < opérateur C ++ - Pointeur en classe
-
06-07-2019 - |
Question
class logger {
....
};
logger& operator<<(logger& log, const std::string& str)
{
cout << "My Log: " << str << endl;
return log;
}
logger log;
log << "Lexicon Starting";
Fonctionne bien, mais je voudrais plutôt utiliser un pointeur sur une instance de classe. c'est-à-dire
logger * log = new log();
log << "Lexicon Starting";
Est-ce possible? Si oui quelle est la syntaxe? Merci
Modifier: l'erreur du compilateur est
error: invalid operands of types 'logger*' and 'const char [17]' to binary 'operator<<'
La solution
Vous devez déréférencer le pointeur sur votre objet enregistreur et vérifier si ce n'est pas 0. Quelque chose comme cela devrait faire l'affaire:
log && ((*log) << "Lexicon starting")
En général, j’aimerais éviter de faire référence à des objets comme un enregistreur (auquel on s’attend normalement sans condition d’être présent) via un pointeur en raison de l’incertitude que vous obtenez avec un pointeur, AKA existe-t-il un objet ou non?
Autres conseils
Voici le chemin:
logger * log = new log();
(*log) << "Lexicon Starting";
Pourquoi ne pas utiliser une référence?
logger & log = *(new log());
// the above is abhorrent code that
// should be replaced by something meaningful
log << "Lexicon Starting";
si ce n’est pas ce que vous voulez, je choisirais Timo Geusch , même si c'est moche
Selon le contexte dans lequel vous obtenez votre consignateur, vous pouvez renvoyer une référence au lieu d'un pointeur:
...
Logger& logger() {
return *_pLogger;
}
...
Logger& log = logger();
log << "...";
Pas vraiment. new log ()
a un type de pointeur, "Lexicon commençant par"
a un type const char [16]
. Vous ne pouvez surcharger les opérateurs que si au moins un argument a un type défini par l'utilisateur.
decasteljau a correctement fait remarquer que vous pouvez le faire via (* log)
, si vous voulez le pointeur. Je n'aime pas le pointeur, cependant. Andrei Alexandrescu consacre pas mal de pages aux singletons d’enregistreurs intelligents dans "Modem C ++ Design", qui vaut peut-être la peine de le consulter.