Conversion boxing implicite de types valeur
La conversion boxing de types valeur a été modifiée entre extensions managées pour C++ vers Visual C++.
Dans la conception de langage, nous avons privilégié une position philosophique au détriment de l'expérience pratique avec la configuration et, dans la pratique, c'est une erreur.Pour faire une analogie, dans la conception initiale de langage d'héritage multiple, Stroustrup décidait qu'un sous-objet de classe de base ne peut pas être initialisé dans un constructeur de classe dérivée, et par conséquent le langage requiert que toute serveur de classe comme classe de base virtuelle doit définir un constructeur par défaut.C'est ce constructeur par défaut qui est appelé par une dérivation virtuelle suivante.
Le problème d'une hiérarchie de classe de base virtuelle est que la responsabilité de l'initialisation de l'initialisation partagé se déplace à chaque dérivation suivante.Par exemple, si je définis une classe de base dont l'initialisation requiert l'allocation d'une mémoire tampon, la taille spécifiée par l'utilisateur de cette mémoire tampon peut être passée en tant qu'argument au constructeur.Si je fournis deux dérivations virtuelles, que nous appellerons inputb et outputb, chacune fournit une valeur particulière au constructeur de classe de base.Maintenant, lorsqu'on peut raisonnablement permettre à I dérivé une classe d' in_out d' inputb et d' outputb, aucune de ces valeurs du sous-objet de classe de base virtuelle partagée pour évaluer.
Par conséquent, dans la conception originelle du langage, Stroustrup refusait l'initialisation explicite d'une classe de base virtuelle dans la liste d'initialiseurs de membre du constructeur de classe dérivée.Bien que cela résolve le problème, l'incapacité de diriger l'initialisation de la classe de base virtuelle est prouvé impraticable.Keith Gorlen de l'institut national santé, qui avait implémenté une version gratuite de la bibliothèque de collection Smalltalk appelée nihcl, a puissamment argumenté pour convaincre Stroustrup qu'il devait rechercher une conception plus flexible de langage.
Un principe de conception hiérarchique orientée objet stipule qu'une classe dérivée doit être concernée que par l'implémentation non privée de ses classes de base immédiates.Pour prendre en charge une conception d'initialisation souple de l'héritage virtuel, Stroustrup a été violer ce principe.La classe la plus dérivée dans une hiérarchie assume la responsabilité de l'initialisation de sous-objets virtuels qu'elle se situe dans la hiérarchie.Par exemple, inputb et outputb sont les deux chargées d'initialiser explicitement leur classe de base virtuelle immédiate.Lorsque in_out dérive des deux inputb et outputb, in_out devient responsable de l'initialisation de la classe de base virtuelle une fois lâchée, et l'initialisation rendue explicite dans inputb et outputb est supprimé.
Cela fournit la souplesse nécessaire aux développeurs de langage, mais au prix d'une sémantique compliquée.Cette complexité peut être allégée en n'autorisant pas une classe de base virtuelle pour avoir un état et en lui permettant simplement pour spécifier une interface.Il s'agit d'un idiome de conception recommandé dans C++.Dans la programmation du CLR, il est déclenché à la stratégie avec le type d'interface.
Voici un exemple de code simple - dans ce cas, la conversion boxing explicite est inutile :
// Managed Extensions for C++ requires explicit __box operation
int my1DIntArray __gc[] = { 1, 2, 3, 4, 5 };
Object* myObjArray __gc[] = {
__box(26), __box(27), __box(28), __box(29), __box(30)
};
Console::WriteLine( "{0}\t{1}\t{2}", __box(0),
__box(my1DIntArray->GetLowerBound(0)),
__box(my1DIntArray->GetUpperBound(0)) );
Comme vous pouvez le constater, il y a de nombreuses conversions boxing.Sous Visual C++, la conversion boxing de type valeur est implicite :
// new syntax makes boxing implicit
array<int>^ my1DIntArray = {1,2,3,4,5};
array<Object^>^ myObjArray = {26,27,28,29,30};
Console::WriteLine( "{0}\t{1}\t{2}", 0,
my1DIntArray->GetLowerBound( 0 ),
my1DIntArray->GetUpperBound( 0 ) );
Voir aussi
Référence
Boxing (extensions du composant C++)