массивы — C ++ инициализировать переменную члена класса зависит от другой переменной члена

В основном, нестатический член 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];
}

1

Решение

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

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

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

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

2

Другие решения

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

Нет, ты не можешь.

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

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

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

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

0