2010-10-29 7 views
12

J'ai surchargé l'opérateur < < d'une classe. Comment dois-je surcharger l'opérateur si je veux l'utiliser sur des pointeurs, comme ce qui suit?Utilisation d'opérateurs surchargés sur des pointeurs

class A { 
    std::string operator<<(std::string&); 
} 

aInst << "This works"; 
aPointer << "This doesnt work"; 
aPointer->operator<<("Whereas this works but is useless"); 

J'espère que vous pouvez m'aider.

heinrich

Répondre

23

Vous devez déréférencer le pointeur premier.

A *ptr = new A(); 
(*ptr) << "Something"; 

La seule autre façon est la façon dont vous avez décrit ci-dessus

Edit: La solution d'André est réalisable ci-dessous aussi, mais comme il a dit qu'il ne peut pas être une bonne idée.

3

Vous ne pouvez pas faire cela. Les fonctions d'opérateur sont uniquement prises en compte pour les opérandes dont l'énumération ou les types de classes sont utilisés.

Après tout, vous changez de pointeur, mais pas de classe. Vous devez explicitement dire que vous voulez passer à un objet de classe en déréférençant d'abord le pointeur.

+0

@sbi, merci. fixe –

+0

(Notez que les «types de classe» englobent les structures et les unions.) – sbi

+0

@sbi correct. les structures et les syndicats sont des classes. Les fonctions d'opérateur sont considérées lorsque les structures et les unions sont des opérandes d'un opérateur approprié, comme pour les classes déclarées avec la classe-clé "class". –

0

Normalement, il n'y a aucune raison de le faire, car l'opérateur sémantiquement < < renvoie une référence à l'objet de flux. Et techniquement, vous ne pouvez pas faire cela.

+2

Non, sémantiquement 'operator <<' devrait retourner l'argument de gauche. –

10

Tout d'abord, pour coller avec les conventions standard, votre operator<< doit être déclarée comme ceci:

class A { 
    A& operator<<(const std::string&); 
}; 

Maintenant, techniquement, vous pourriez achiever partie de ce que vous voulez en mettant en œuvre la fonction globale suivante:

A * operator<< (A * a, const std::string& s) { (*a) << s; return a; } 

Cela permettrait des déclarations telles que:

Cependant, vous ne serez pas en mesure d'écrire ce qui suit:

aPointer << "this will not compile."; 

Dans tous les cas, écrire un tel opérateur serait confusion, au mieux. Vous devez vivre avec plus de syntaxe simple

(*aPointer) << "this will be printed."; 

et écrire du code qui colle aux conventions établies pour permettre aux autres (et vous-même, dans quelques semaines) de votre code.

Questions connexes