2010-02-07 5 views
7

Pour deux classes sans rapport avec "classe A" et "classe B" et une fonctionC++ conversions auto

B convert(const A&); 

Est-il possible de dire C++ automatiquement, pour toute fonction qui prend "classe B" argument, pour convertir automatiquement une "classe A".

Merci!

+2

Si vous ne pouvez pas modifier les définitions de classe pour la classe A ou la classe B, il n'y a pas de bon moyen de le faire. – Omnifarious

Répondre

10

Qu'est-ce que vous feriez normalement dans ce cas est de donner B un constructeur qui prend un A:

class B 
{ 
public: 
    B(const A&); 
}; 

Et faire la conversion là-bas. Le compilateur dira "Comment puis-je faire A un B? Oh, je vois B peut être construit à partir d'un A".

Une autre méthode consiste à utiliser un opérateur de conversion:

class A 
{ 
public: 
    operator B(void) const; 
} 

Et le compilateur dira: « Comment puis-je faire un AB Oh, je vois A peut être converti en B? ». Gardez à l'esprit qu'il est très facile d'abuser de ces codes. Assurez-vous qu'il est logique que ces deux types se convertissent implicitement les uns aux autres.

+3

Je seconde l'avertissement concernant les opérateurs de conversion implicite. Au cours des dix dernières années, chaque fois que j'ai été tenté de présenter une telle chose (à l'exception d'une classe de cordes que j'ai écrite), tôt ou tard, il s'est avéré que personne ne s'y attendait et a donc été retiré du code. à un coût très élevé. Gardez également à l'esprit que le compilateur n'appellera toujours que la conversion exactement définie par l'utilisateur _one_. Donc, s'il y a aussi une conversion définie par l'utilisateur de 'B' à' C', vous ne pouvez pas appeler 'void f (C)' avec un 'A', car cela nécessiterait deux conversions. – sbi

1

Vous pouvez fournir un opérateur de distribution ou un constructeur à un paramètre.