2016-07-12 3 views
-1

Как построить класс B, используя константное значение из класса А, например, так:Инициализировать класс B со значением const из класса A?

class A 
{ 
public: 
    A(); 
private: 
    B b_; 
    const float PARAM_ = 7.7; 
} 

class B 
{ 
    B(float param); 
} 

A::A() : b_(PARAM_) 
{ 

} 

Я получаю значение для мусора в PARAM выше, когда b_ создается вместо ожидаемого 7.7. Каков правильный путь?

+3

[mcve] пожалуйста? – juanchopanza

+0

Положите определение для 'b_' * после *, что для' PARAM_'? – immibis

ответ

1

Проблема в том, что в C++ нестатические элементы инициализируются в порядке объявления. b_ объявлен до PARAM_, поэтому, когда вы вносите b_(PARAM_) в список инициализации членов, b_ инициализируется значением мусора и , тогдаPARAM_ инициализируется до 7.7. Чтобы этого избежать, переместите объявление PARAM_ до b_.

+0

Это правда, НО вы никогда (если нет другого варианта) должны писать код, который зависит от порядка декларации. Это очень неправильная практика программирования. По крайней мере, это то, чему они меня научили :). – Lehu

+0

Работает, но мне действительно не нравится это решение. :-( – Danijel

+0

@ Danijel Если значение 'PARAM_' не предназначено для установки другого значения другим конструктором, оно, вероятно, должно быть« статическим », как говорит другой ответ. –

0

Если это подходит для использования, вы можете сделать const static. Проблема возникает из-за того, что неконтентная версия вашего параметра не была инициализирована к тому времени, когда вы попытаетесь использовать ее в конструкторе b.

Как статический, он был бы инициализирован ранее.

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