2011-03-31 5 views
4

J'ai une classe Terminallog qui surcharge l'opérateur < <. Si je fais ce qui suitL'opérateur "<<" à un pointeur

Terminallog clog(3); 
clog << "stackoverflow.com is cool" << endl; 

tout fonctionne bien. "stackoverflow.com is cool" est imprimé d'une belle manière colorée à l'écran, exactement ce que Terminallog est censé faire.

Maintenant, j'essaie

Terminallog* clog = new Terminallog(3); 
clog << "stackoverflow.com is cool" << endl; 

qui me donne une erreur de compilation:

error: invalid operands of types ‘Terminallog*’ and ‘const char [5]’ to binary ‘operator<<’ 

je peux voir qu'il est un problème qui passe l'opérateur « < < » à un pointeur, mais comment obtenir le même comportement qu'avec la version non pointer? Je pourrais simplement déréférencer le pointeur, mais cela créerait une copie locale de l'objet (ce qui n'est pas bon pour la performance n'est-ce pas?)

Par conséquent, je me demande quelle est la bonne façon de le faire?

Merci à l'avance

ftiaronsem

+3

Je ne pense pas que le déréférencement du pointeur crée une copie locale de l'objet. –

Répondre

8

déréférencement d'un pointeur pour écrire

*clog << "My message" << endl; 

ne fait pas créer une copie de l'objet pointé. En général, les déréférences de pointeurs ne font pas de copies, et la seule façon de faire une copie est d'en créer explicitement une, de passer un objet dans une fonction par valeur, ou de renvoyer un objet d'une fonction par valeur. Le code ci-dessus avec le déréférencement du pointeur est probablement ce que vous cherchez.

+1

Pour être complet, déréférencer le pointeur crée une référence (sémantiquement). –

2

Déréférencer le pointeur ne crée pas une copie, il crée une référence. Vous pouvez simplement le refaire et obtenir le bon comportement, pas de copie.

1

simple: (*clog) << "stackoverflow.com is cool" << endl;

Cela ne crée pas une copie de clog.

+1

Vous avez une erreur de syntaxe. –

+0

Oups, a copié le << deux fois. – MSalters

4

En fait, le déréférencement du pointeur vous donne une référence, pas une copie, donc tout va bien. (Essayez de copier un flux serait et devrait échouer, de toute façon, les flux ne sont pas des conteneurs, mais les flux de données.)

*clog << "text" << std::endl; 

Vous ne pouvez pas écrire une fonction libre (« global ») operator<< prendre un pointeur- à-TerminalLog à gauche et les autres à droite, car le langage nécessite au moins un des opérandes operator<< pour être un type de classe ou d'enum, et votre argument RHS ne le sera pas souvent.

+0

La langue ne le permet pas. – Puppy

+0

@DeadMG: Oups, vous avez raison bien sûr –

+0

Vous raisonnez est faux. Le côté de l'opérande n'a aucune signification. Ce qui importe c'est qu'au moins l'un des opérandes est de type classe ou enum. (http: // ideone.com/4zhQt) – visitor

1
Terminallog* clog = new Terminallog(3); 
Terminallog& clog_r = *clog; 
clog_r << "stackoverflow.com is cool" << endl; 
+0

vous voulez dire 'Terminallog & clog_r = * clog; – CharlesB