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<<'
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top