2010-03-11 7 views
1

Il existe deux classes: A et B. Il existe des algorithmes pour la conversion du type A au type B et inversement. Nous ne pouvons pas toucher le code source d'entre eux. Puis-je écrire une conversion implicite entre les deux types?Conversion implicite entre types de tiers

code exemple qui devrait fonctionner:

B CalculateSomething(double x) 
{ 
    A a(x); 
    a.DoSomethingComplicated(); 
    return a; 
} 
+4

conversion implicite souvent causer plus de mal que de bien, puisque vous ne savez pas ce qui se passera juste en regardant le code. Une mauvaise affectation peut entraîner un comportement étrange. Vous devriez être vraiment prudent lorsque vous les utilisez. –

Répondre

2

Non, je ne pense pas alors. La conversion implicite est généralement codée avec un opérateur surchargé. C'est fait pour les types de base aussi. Comme vous ne pouvez pas modifier le code A et B, il n'y a aucun moyen de dire au compilateur comment faire cela. Votre extrait obtiendra une erreur.

Vous devez effectuer une conversion explicite. Juste

return helper.convertToB(a); 

MY2C

+1

"La conversion implicite est généralement codée avec un opérateur surchargé." Ou en utilisant un constructeur implicite. Je préférerais ce dernier, bien que j'aie appris à la dure pour éviter toute conversion implicite. – sbi

+0

@sbi: Je suis d'accord. Je préfère TOUJOURS une conversion EXPLICITE. Ah, la lisibilité et la facilité de maintenance, pourquoi êtes-vous tellement sous-estimé ... – neuro

0

Il existe deux classes: A et B. Il existe des algorithmes pour la conversion de type A au type B et le dos. Nous ne pouvons pas toucher le code source d'entre eux. Puis-je écrire une conversion implicite entre les deux types?

Non, si A et B ne sont pas liés vous ne pouvez pas. (Et je suis reconnaissant pour cela. Les conversions implicites donnent assez de maux de tête car ils sont sans la possibilité de les créer pour les classes de 3e parti.)

0

pas possible sans altérer la définition de classe

2

Non, mais vous pouvez écrire une fonction sans nom pour le faire.

B ToB(const A & a) { 
    B b; 
    // process a somehow to add its data to b 
    return b; 
} 

Votre code devient alors:

B CalculateSomething(double x) 
{ 
    A a(x); 
    a.DoSomethingComplicated(); 
    return ToB(a); 
} 

qui est sans doute plus claire que la conversion serait implicite être.

0

Même si vous ne pouvez pas modifier l'implémentation de A ou B, vous pouvez ajouter un constructeur en ligne à la définition de B qui prend un const &.

Je pense toutefois que si les classes sont vraiment étroitement liés, il serait préférable de fournir une fonction de conversion explicite - les conversions implicites peuvent être une source énorme de bugs difficiles à trouver:

B CalculateSomething(double x) 
{ 
    A a(x); 
    a.DoSomethingComplicated(); 
    return ConvertAToB(a); 
} 
+3

Comment le feriez-vous sans toucher au code source de A & B? – mukeshkumar

+0

Vous ne parlez pas de modifier des en-têtes tiers, n'est-ce pas? Sinon, vous allez avoir une belle incompatibilité binaire brillante. – Vlad

+0

Vous ne devriez pas avoir d'incompatibilité binaire si vous ne changez pas la vtable de la classe (c'est-à-dire n'ajoutez aucune méthode virtuelle).Ce n'est pas une bonne solution, c'est la seule solution si (pour une raison quelconque) vous avez vraiment besoin de la conversion implicite. Comme je l'ai dit dans la deuxième partie de ma réponse, les conversions implicites sont généralement mauvaises - ma recommandation (comme d'autres l'ont indiqué) serait une méthode de conversion explicite ou une aide. – Bids

Questions connexes