Как объявить массив без определенного размера в качестве члена класса? Я хочу установить размер этого массива сразу в конструкторе класса. Можно ли делать такую вещь без использования кучи или без изменения размера массива?Как объявить массив без определенного размера?
ответ
C++ требует, чтобы размер автоматического хранилища был известен во время компиляции, иначе массив должен быть динамически распределен. Так что вам нужно будет динамическое распределение на каком-то уровне, но вы не должны беспокоиться делать это непосредственно: просто использовать std::vector
:
#include <vector>
class Foo
{
public:
Foo() : v_(5) {}
private:
std::vector<int> v_;
};
Здесь v_
вектор проведение ints
, и сконструирован так, чтобы иметь размер 5
. Вектор заботится о динамическом распределении для вас.
В C++ 14 у вас будет возможность использовать std::dynarray
, что очень похоже на std::vector
, за исключением того, что его размер фиксируется при строительстве. Это ближе соответствует простой динамически распределенной функциональности массива.
Массивы переменной длины не допускаются стандартом C++. Варианты у вас есть следующие:
- Используйте
std::vector
или - Используйте указатель на динамическую память
Обратите внимание, что массивы переменной длины поддерживаются большинством компиляторов, как расширение, поэтому если вы не беспокоится о переносимости, и ваш компилятор поддерживает его, вы можете использовать его. конечно, у него есть своя доля проблем, но это вариант с учетом ограничений, которые вы указали.
Вы можете использовать вектор, указав заголовочный файл #include<vector>
Он может расти и уменьшаться по размеру по мере необходимости, а векторы встроены в методы/функции, которые могут облегчить вашу работу.
Единственный способ выделить динамический массив на C++ без использования кучи - это сделать это в стеке.
void func(int size)
{
int my_array[size];
}
Тогда вы могли бы передать этот указатель в класс:
class stuff
{
public:
stuff(int *ary) : f_array(ary) {}
private:
int *f_array;
};
stuff my_stuff(my_array);
Сейчас, честно говоря, я бы использовать зЬй :: вектор <>(), как это представлено в другие ответы, которые будет выделять память из кучи, но имеет все необходимые меры защиты, чтобы помочь вам написать гораздо более безопасный код.
VLA не является утвержденной конструкцией C++. Он поддерживается большинством (* read all *) компиляторов в качестве расширения языка. Таким образом, хотя это способ создания динамического массива на C++ технически, это не стандартный одобренный способ. –
Ну ... есть также функция alloca(). Наверное, это не в стандарте C++. –
Элемент класса элемента должен быть объявлен с точным размером времени компиляции. Об этом нет.
Единственный способ вы можете объявить массив в качестве непосредственного члена класса и все же быть в состоянии решить ее размер во время выполнения будет популярной "struct hack" техника, унаследованная от С.
Кроме этого, у вас есть объявить ваш массив как косвенный член класса: либо объявить член типа указателя, либо позже выделить память, либо использовать некоторую библиотечную реализацию массива времени выполнения (например, std::vector
)
В C++ размер массива должен быть равен фиксироваться во время объявления массива, т. е. вы должны использовать постоянный размер.Для переменной величины вам нужно использовать новый оператор или malloc, но это создает массив в куче. – Bourne
В C++ 14 у нас будет возможность использовать ['dynarray'] (http://en.cppreference.com/w/cpp/container/dynarray/dynarray). Пока, как говорили другие, «std :: vector» - это путь. – jrok