Je sais qu'il n'y a aucun moyen de le faire dans pure C ++ , mais Je me demandais s'il est possible d'appeler un constructeur à partir d'une liste d'initialisation d'un autre constructeur en C ++ / CLI, identité on peut le faire en C #.
Exemple: P>
ref class Foo { Foo() {} Foo(int i) : Foo() {} }
4 Réponses :
On appelle un "constructeur de délégation". Il n'est pas encore disponible dans la langue. Mais il y a une proposition formelle, vous le trouverez à l'annexe F.3.1 du Spécification de la langue . Compte tenu de la position de Microsoft en direction de C ++ / CLI, il est peu probable de voir la lumière de la journée à tout moment bientôt. P>
MISE À JOUR: Les constructeurs déléguants ont eu une vie au-delà de la proposition de cette annexe, elles ont été ajoutées à la spécification de langue C ++ 11 standard. Microsoft travaille sur la mise en œuvre des ajouts C ++ 11. Les constructeurs de délégation ont finalement fait pour VS2013. Et ils travaillent également en C ++ / CLI dans cette édition. P>
Vous pouvez faire suite à
ref class A { public: A(int p) : p(p) { this->A::A(); } A() : p(1) {} int p; };
Lorsque vous avez dit "Je sais qu'il n'y a aucun moyen de le faire en pure C ++" em> fort> vous étiez en erreur. Il est possible de le faire dans Native C ++. Vous pouvez utiliser le nouvel opérateur de placement pour le faire. class A
{
public:
A(int p) : p(p)
{ new(this)A(); }
A() : p(1) {}
int p;
};
vient de trébucher, pour la même question. Dans mon cas, j'utilise VS2010.
Il est clair que VS2010 ne sera jamais mis à jour pour implémenter complètement C ++ 11, utilisez VS2015 si vous avez besoin d'une meilleure conformité avec la norme (que je fais quand je peux). Mais pour certains projets (hérité), je dois encore utiliser VS2010. P>
Une approche qui fonctionne dans de nombreux cas (pour moi) est l'utilisation d'une fonction privée avec tous les codes d'initialisation partagés. Exemple: P>
class A { private: void Inidialise() { /* common initialisation here */ } public: A() { Initialise(); /* specific initialisation for A() here */ } A(bool a) { Initialise(); /* specific initialisation for A(bool) here */ } A(int b) { Initialise(); /* specific initialisation for A(int) here */ } /* etcetera */ }
C ++ 0x soutiendra cela, en fait