2016-12-16 3 views
1

В принципе, нестатический член theta, который инициализируется другим членом класса, но хорошо инициализирован. Затем valley_max инициализирован theta, как вы можете видеть. Сейчас все работает нормально. Затем я хочу инициализировать массив, чья граница равна valley_max. Во-первых, я получил ошибку:C++ инициализировать переменную-член класса зависит от другой переменной-члена

недопустимое использование нестатической элемента данных

Затем я добавляю static const int valley_max, как вы можете видеть. Но я получил ошибку, как:

массив связан не целая константа, прежде «]» маркер

Я просто интересно, если я могу инициализировать массив, Bound инициализируется переменная-член, который инициализируется другим переменные-члены.
Спасибо за помощь.

AP_Tmxk_VFH.cpp

AP_Tmxk_VFH::AP_Tmxk_VFH() : 
    l(5), 
    threshold(5), 
    safe_space(0.7), 
    detected_range(2.5), 
    theta(degrees(acos(1-sq(safe_space)/(2*sq(detected_range))))), 
    valley_max(round_float(180.0/theta)), 
    valley_count(0), 
{ 
} 

AP_Tmxk_VFH.h

class AP_Tmxk_VFH { 
privte: 
     int l; 
     int threshold; 
     int safe_space; 
     int theta; 
     int detected_range; 
     static const int valley_max ; 
     struct{ 

     bool inside_valley = false; 
     uint16_t up_bound = 0; 
     uint16_t down_bound = 0; 
    }valley[valley_max]; 
} 

ответ

2

Ваш конкретный вопрос связан с тем, что массивы переменной длины не поддерживаются в C++. Вместо этого рассмотрите использование std::vector или другого контейнера стандартной библиотеки C++.

Но у вас есть дополнительные проблемы (на мой взгляд, делает ваш вопрос интересный): порядок инициализации членов является порядок их появления в определении класса, не порядке их появления в инициализации.

Например, в вашем случае theta инициализируется перед темdetected_range, а так как последний не инициализируется в точке вы используете его в оценке theta, поведение вашего кода не определен!

В вашем случае, если вам не нужны члены, которые должны быть const, я бы инициализировал те, которые не были установлены в литералы в теле конструктора, если бы я был вами.

0

Мне просто интересно, могу ли я инициализировать массив, чья привязка инициализирована переменной-членом, которая инициализируется другими переменными-членами.

Нет, вы не можете.

Вы не можете, потому что такая переменная

не целая константа

как говорится в сообщении об ошибке.Значение переменной-члена неизвестно во время компиляции, что противоречит требованию о том, что размер массива должен составлять постоянную времени компиляции (т. Е. Известен во время компиляции).

Вместо этого используйте std::vector. Размер вектора не блокируется во время компиляции.

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