2013-06-23 13 views
4

Как объявить массив без определенного размера в качестве члена класса? Я хочу установить размер этого массива сразу в конструкторе класса. Можно ли делать такую ​​вещь без использования кучи или без изменения размера массива?Как объявить массив без определенного размера?

+0

В C++ размер массива должен быть равен фиксироваться во время объявления массива, т. е. вы должны использовать постоянный размер.Для переменной величины вам нужно использовать новый оператор или malloc, но это создает массив в куче. – Bourne

+0

В C++ 14 у нас будет возможность использовать ['dynarray'] (http://en.cppreference.com/w/cpp/container/dynarray/dynarray). Пока, как говорили другие, «std :: vector» - это путь. – jrok

ответ

3

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, за исключением того, что его размер фиксируется при строительстве. Это ближе соответствует простой динамически распределенной функциональности массива.

5

Массивы переменной длины не допускаются стандартом C++. Варианты у вас есть следующие:

  • Используйте std::vector или
  • Используйте указатель на динамическую память

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

0

Вы можете использовать вектор, указав заголовочный файл #include<vector> Он может расти и уменьшаться по размеру по мере необходимости, а векторы встроены в методы/функции, которые могут облегчить вашу работу.

-2

Единственный способ выделить динамический массив на 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); 

Сейчас, честно говоря, я бы использовать зЬй :: вектор <>(), как это представлено в другие ответы, которые будет выделять память из кучи, но имеет все необходимые меры защиты, чтобы помочь вам написать гораздо более безопасный код.

+2

VLA не является утвержденной конструкцией C++. Он поддерживается большинством (* read all *) компиляторов в качестве расширения языка. Таким образом, хотя это способ создания динамического массива на C++ технически, это не стандартный одобренный способ. –

+0

Ну ... есть также функция alloca(). Наверное, это не в стандарте C++. –

0

Элемент класса элемента должен быть объявлен с точным размером времени компиляции. Об этом нет.

Единственный способ вы можете объявить массив в качестве непосредственного члена класса и все же быть в состоянии решить ее размер во время выполнения будет популярной "struct hack" техника, унаследованная от С.

Кроме этого, у вас есть объявить ваш массив как косвенный член класса: либо объявить член типа указателя, либо позже выделить память, либо использовать некоторую библиотечную реализацию массива времени выполнения (например, std::vector)