J'ai un constructeur qui prend quelques arguments. J'avais supposé qu'elles avaient été construites dans l'ordre indiqué, mais dans un cas, il semble qu'elles aient été construites en sens inverse, ce qui a entraîné un avortement. Lorsque j'ai inversé les arguments, le programme a cessé d'abandonner. Ceci est un exemple de la syntaxe que j'utilise. Le fait est que a_ doit être initialisé avant b_ dans ce cas. Pouvez-vous garantir l'ordre de construction?
par exemple.
class A
{
public:
A(OtherClass o, string x, int y) :
a_(o), b_(a_, x, y) { }
OtherClass a_;
AnotherClass b_;
};
Cela dépend de l'ordre de déclaration des variables membres dans la classe. Alors a_
sera le premier, puis b_
sera le deuxième dans votre exemple.
Pour citer la norme, pour clarification:
12.6.2.5
L'initialisation doit se dérouler dans l'ordre suivant:
...
- Ensuite, les membres de données non statiques doivent être initialisés dans l'ordre dans lequel ils ont été déclarés dans la définition de classe (toujours indépendamment de l'ordre des mem-initializer).
...
Le référence standard apparaît à présent comme étant 12.6.2 section 13.3:
(13.3) - Ensuite, les membres de données non statiques sont initialisés dans l'ordre dans lequel ils ont été déclarés dans la définition de classe (encore une fois, quel que soit l'ordre des initialiseurs de mémoire).