2017-01-16 2 views
0

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

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

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 мусор.

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

  • инициализацию константный Int в заголовочном файле
  • Создание и инициализацию объекта в теле конструктора
  • использовать #define
+3

Если 'comPort' определен в классе до' B', то это не будет мусор. Здесь недостаточно информации, чтобы ответить на ваш вопрос или воспроизвести проблему. – wally

+0

Я буду редактировать в более полном примере, извинения! – YouKnowNothingJohn

+0

Добавлен более сложный пример кода. – YouKnowNothingJohn

ответ

0

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

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

+0

Как упоминал Франсуа в комментариях, я считаю, что это был преступник! – YouKnowNothingJohn

1

Похоже, что проблема заключается в том, что ваши члены инициализированы. Члены класса инициализируются в том порядке, в котором они объявлены. Порядок, который они инициализируются в конструкторе, не отменяет этого. В следующем примере 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; 
} 
+0

Менее хрупким подходом было бы вовсе не полагаться на заказ. 'bar (const int var = 5): my_const (var), my_foo (var) {}' избавляется от любой зависимости. – NathanOliver

Смежные вопросы