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