В основном, нестатический член theta
которые инициализируются другим членом класса, но хорошо инициализированы. затем valley_max
инициализируется theta
как вы видете. Щас все отлично работает. Затем я хочу инициализировать массив, граница которого valley_max
, Во-первых, я получил ошибку:
неверное использование нестатического члена данных
Потом добавляю static const int valley_max
как вы видете. Но я получил ошибку как:
граница массива не является целочисленной константой перед маркером ‘]’
Мне просто интересно, могу ли я инициализировать массив, граница которого инициализируется переменной-членом, которая инициализируется другими переменными-членами.
Спасибо за вашу помощь.
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];
}
Ваша конкретная проблема связана с тем, что массивы переменной длины не поддерживаются в C ++. Рассмотрите возможность использования std::vector
или другой стандартный контейнер библиотеки C ++.
Но у вас есть дальнейшие проблемы (что, на мой взгляд, делает ваш вопрос интересным): порядок инициализации членов — это порядок их появления в определении класса, не порядок, в котором они появляются при инициализации.
Например, в вашем случае theta
инициализируется до detected_range
и поскольку последнее не инициализируется в точке, в которой вы используете его при оценке theta
, поведение вашего кода не определено!
В вашем случае, если вам не нужны члены, чтобы быть const
Я бы инициализировал те, которые не установлены литералами в теле конструктора, если бы я был вами.
Мне просто интересно, могу ли я инициализировать массив, граница которого инициализируется переменной-членом, которая инициализируется другими переменными-членами.
Нет, ты не можешь.
Вы не можете, потому что такая переменная
не целочисленная константа
как говорится в сообщении об ошибке. Значение переменной-члена неизвестно во время компиляции — что противоречит требованию о том, что размер массива должен быть постоянной времени компиляции (т.е. известен во время компиляции).
Решение: использовать std::vector
вместо. Размер вектора не блокируется во время компиляции.