2010-05-14 6 views
0

en C++ i ai code suivantcomment appeler l'opérateur() en C++

class Foobar{ 
public: 
    Foobar * operator()(){ 
     return new Foobar; 
}; 

Mon quesion est comment appeler le(); si je fais Foobar foo() le constructeur est appelé je suis confus au sujet du comportement de() certains peuvent me expliquer

Répondre

5

Alors que la réponse de GMan est factuellement correcte, vous ne devriez jamais surcharger un opérateur de faire quelque chose d'inattendu - cela va à l'encontre de toutes les règles de programmation de bonnes pratiques. Lorsqu'un utilisateur lit un code, il s'attend à ce que les opérateurs se comportent d'une manière ou d'une autre, et les faire se comporter différemment n'est bon que pour les compétitions de codage obscurcissantes.

L'opérateur () en C++ peut être utilisé pour transformer un objet en une fonction. Cela a en fait un nom - il est appelé foncteur, et est largement utilisé dans la STL pour fournir des algorithmes génériques. Google pour stl functor pour en apprendre davantage sur un bon usage de la technique.

+0

Ce n'est pas la seule utilisation courante de 'operator()'. Il est également utilisé pour enchaîner. 'boost :: program_options' montre un bon exemple avec son' options_description_easy_init :: operator()() '(mais le client ne gère que' options_description :: add_option() 'qui retourne le type chainable). Vous l'utilisez pour ajouter du support pour une option de ligne de commande après l'autre. Il est également courant d'utiliser 'operator <<' et 'operator >>' dans le même but. 'std :: cout' et' std :: cin' sont l'exemple classique ici. Le choix parmi ces trois est généralement un choix d'esthétique. – wilhelmtell

+0

Alors que vous avez certainement raison sur les opérateurs en général (ne surchargez pas '+' pour faire le travail de '* ='), il me semble que 'operator()()' est une exception. Il est utilisé pour imiter une fonction et les fonctions sont utilisées pour faire n'importe quoi, donc il n'y a pas de limite conventionnelle à quoi 'operator()()' est habitué. Ca fait -1 de moi, malgré ton gentil avatar. ':)' – sbi

5

Comme ceci:

Foobar f; 
Foobar* p = f(); // f() invokes operator() 
delete p; 

cela aussi est très étrange, en termes de renvoyer un pointeur comme ça et c'est une fonction plutôt inutile. (? Je « besoin » d'un Foobar pour faire une nouvelle)

+8

J'ajouterais la qualification que vous * ne devriez pas faire ceci *. C'est vraiment bizarre et non-idiomatique de renvoyer une nouvelle instance de 'operator()'! –

Questions connexes