Строка vector<float> band(max_oct);
не делает то, что вы думаете.
Определяет автоматическую переменную с именем band
в области видимости конструктора Spectrum. Она не касается переменной-члена, также называемой band
: фактически она «скрывает» ее, так что любые последующие ссылки на band
в конструкторе ссылаются на автоматическую переменную, а не на переменную-член (к которой вы могли бы обращаться с помощью this->band
).
То, что вы хотите:
Spectrum(int max_oct = 3) : oct(max_oct), band(max_oct) {
}
или (менее хорошо, потому что он создает пустой вектор и затем изменяет его размер, вместо того, чтобы сначала создать правильный размер):
Spectrum(int max_oct = 3) {
oct = max_oct;
band.resize(max_oct);
}
Между прочим, я думаю, что вы могли бы путать size
и capacity
векторов (хотя не уверен из того, что вы говорите). Конструктор с одним аргументом vector
создает вектор с указанным размером. Поэтому, если вы этого еще не сделали, вы должны ожидать, что емкость будет 8 или больше , а не 8.
[Редактировать: в ответ на ваш следующий вопрос, вам нужно инициализировать lpow
в total()
: float lpow = 0;
]