Инициализируйте const int и объект с этим const int в одном конструкторе

У меня есть объект, который создается в файле.h, который должен быть инициализирован в конструкторе. Этому объекту передается номер COM-порта, который равен 5 в нашем текущем приложении. По этой причине я создал const int в.h файле.

Изменить: я добавил более полный пример

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

Поскольку объект инициализируется до полной инициализации comPort, значение для comPort является мусором.

Каков был бы правильный способ обойти это? Я могу думать о следующем:

  • Инициализируйте const int в заголовочном файле
  • Создать и инициализировать объект в теле конструктора.
  • использовать #define

2 ответа

Решение

Вы можете воспроизвести свою ошибку, если вы обменяете декларацию comPort а также B в определении ClassA, См. Этот комментарий к SO относительно порядка оценки списка инициализации конструктора.

Следовательно, убедитесь, что если список инициализатора опирается на определенный порядок оценки, то объявление инициализируемых членов должно соответствовать этому порядку.

Похоже, проблема с порядком инициализации ваших участников. Члены класса инициализируются в порядке их объявления. Порядок, в котором они инициализируются в конструкторе, не отменяет этого. В следующем примере bar::my_foo инициализируется раньше bar::my_const, что вызовет проблемы. my_foo будет инициализирован с унифицированным my_const член;

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

Проблема может быть решена путем изменения порядка объявления участников.

struct bar {
    bar() : my_const(5), my_foo(my_const) {}
    const int my_const; // my_const before my_foo
    foo my_foo;
}
Другие вопросы по тегам