7
votes

Comment transmettre un appel de constructeur surchargé sur un autre constructeur en C ++ / CLI

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() {}
}


1 commentaires

C ++ 0x soutiendra cela, en fait


4 Réponses :


16
votes

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.


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.


0 commentaires

2
votes

Vous pouvez faire suite à

ref class A
{
public:
    A(int p) : p(p) { this->A::A(); }
    A() : p(1) {}

    int p;
};


0 commentaires

-4
votes

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; 
};


0 commentaires

0
votes

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 */

}


0 commentaires