J'ai un objet qui est créé dans un fichier .h qui devrait être initialisé dans le constructeur. Cet objet reçoit un numéro de port COM qui est 5 dans notre application actuelle. Pour cette raison, j'ai créé un const int dans le fichier .h.

Modifier: j'ai ajouté un exemple plus complet

class ClassB
{
public:
    ClassB(int comPort);
private:
    int m_comPort;
};

ClassB::ClassB(int comPort) :
    m_comPort(comPort)
{
}

class ClassA
{
public:
    ClassA();
private:
    const int comPort;
    ClassB B;
};

ClassA::ClassA() :
    comPort(5),
    B(comPort)
{
}

int main()
{
    ClassA A;
    return 0;
}

Étant donné que l'objet est initialisé avant que comPort ne soit complètement initialisé, la valeur de comPort est garbage.

Quelle serait la bonne façon de contourner cela? Je peux penser à ce qui suit:

  • Initialiser le const int dans le fichier d'en-tête
  • Créer et initialiser l'objet dans le corps du constructeur
  • utiliser un #define
0
YouKnowNothingJohn 16 janv. 2017 à 18:39

2 réponses

Meilleure réponse

Vous pouvez reproduire votre erreur si vous échangez la déclaration de comPort et B dans la définition de ClassA. Voir ce commentaire sur SO concernant l 'Ordre d'évaluation de la liste d'initialisation du constructeur.

Par conséquent, assurez-vous que si une liste d'initialiseurs repose sur un ordre d'évaluation spécifique, alors la déclaration des membres à initialiser doit respecter cet ordre.

0
Community 23 mai 2017 à 12:24

Cela semble être un problème avec l'ordre dans lequel vos membres sont initialisés. Les membres de la classe sont initialisés dans l'ordre dans lequel ils sont déclarés . L'ordre dans lequel ils sont initialisés dans le constructeur ne remplace pas cela. Dans l'exemple suivant, bar::my_foo est initialisé avant bar::my_const, ce qui posera des problèmes. my_foo sera initialisé avec un membre my_const unifié;

struct foo {
    foo(int p_x) : x(p_x) {}
    int x;
}

struct bar {
    bar() : my_const(5), my_foo(my_const) {}
    foo my_foo;
    const int my_const;
}

Le problème peut être résolu en modifiant l'ordre dans lequel les membres sont déclarés.

struct bar {
    bar() : my_const(5), my_foo(my_const) {}
    const int my_const; // my_const before my_foo
    foo my_foo;
}
1
François Andrieux 16 janv. 2017 à 16:14