2009-03-09 7 views
3
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 souhaite utiliser un pointeur vers une instance de classe à la place. c'est-à-direSurcharge << opérateur C++ - Pointeur vers la classe

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

Est-ce possible? Si oui, quelle est la syntaxe? Merci

Edit: L'erreur du compilateur est

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

Répondre

11

Vous auriez à déréférencer le pointeur sur votre objet enregistreur et vérifiez évidemment, si ce n'est pas 0. Quelque chose comme ça devrait faire l'affaire:


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

En général, je serais loin de référencer des objets comme un enregistreur (que vous attendez normalement inconditionnellement d'être présent) via un pointeur en raison de l'incertitude que vous obtenez avec un pointeur, AKA est là un objet ou pas?

+1

Convenu. Créez l'enregistreur pendant l'initialisation du programme, puis fournissez un moyen d'obtenir une référence plutôt qu'un pointeur. Vous pouvez également utiliser std :: cerr en tant que votre enregistreur en le rouvrant pour pointer vers un fichier (bien que cela nécessite un peu de travail car il est légèrement hacky :) – workmad3

+0

Oh, et assurez-vous d'utiliser des parenthèses correctes. log && ((* log) << "Démarrage du Lexicon") pour que les choses se passent bien :) – workmad3

+0

Bonne idée, merci de l'avoir signalé ... –

9

Voici le chemin:

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

En fonction du contexte dans lequel vous obtenez votre enregistreur de, vous pouvez retourner une référence au lieu d'un pointeur:

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

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

Pourquoi voudrait-il faire ça? –

+0

Il me semble qu'il obtient son instance de logger d'une structure de classe où il pourrait être plus utile de renvoyer la référence que le pointeur vers l'implémentation de l'enregistreur interne. Comme je l'ai dit: «Selon le contexte». –

2

Pas vraiment. new log() a un type de pointeur, "Lexicon starting" a le type const char[16]. Vous pouvez uniquement surcharger les opérateurs si au moins un argument a un type défini par l'utilisateur. Decasteljau a correctement remarqué que vous pouviez faire cela via (*log), si vous vouliez le pointeur. Je n'aime pas le pointeur, cependant. Andrei Alexandrescu consacre pas mal de pages sur les singletons de logger intelligents dans "Modern C++ Design", cela vaut peut-être la peine de le consulter.

5

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 que je partirais avec Timo Geusch, même si elle est laide

Questions connexes