Инициализируйте 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;
}