Question

J'ai examiné un code qui ressemble à ceci:

class A; // defined somewhere else, has both default constructor and A(int _int) defined
class B
{
public:
    B(); // empty
    A a;
};

int main()
{
     B* b;
     b = new B();
     b->a(myInt); // here, calling the A(int _int) constructor,
     //but default constructor should already have been called
}

Est-ce que ça marche? Vous appelez un constructeur spécifique après que la valeur par défaut a déjà été appelée?

Était-ce utile?

La solution

Ce code n’appelle pas le constructeur de a. Il appelle A :: operator () (int) .

Mais si vous appelez explicitement un constructeur sur un objet déjà construit, vous êtes déjà plongé dans un comportement indéfini. Cela peut sembler fonctionner dans la pratique, mais rien ne garantit qu’il fera ce que vous attendez.

Autres conseils

vous pouvez créer un autre constructeur en classe B

B (int _int): a (_int) {}

dans ce cas quand vous écrivez b = new B (myInt);

Le code ci-dessus ne retardera pas le code de constructeur de la classe A.

vous n'avez pas besoin d'appeler b- > a (myInt)

Ceci n’appelle pas le constructeur, et cette réponse ne couvre que la explication possible de ce qui se passe.

Le seul moyen standard d'appeler un constructeur sur un objet existant consiste à utiliser le placement new (après la destruction de l'instance précédente):

void foo (A * a) {
  a->~A ();           // Destroy previous instance
  new (a) A(myInt);   // Construct new object in same location
} 

Vous devez simplement appeler le constructeur A (int) depuis le constructeur B () ou créer un constructeur B (int) qui appelle également le constructeur A (int).

La meilleure pratique consiste à utiliser les deux options, celle par défaut pour configurer un int par défaut pour A et celle B (int) pour init A (int).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top