C++: как создать массив объектов на стеке?

Нет, ключи в JSON должны быть уникальными. Вы можете попробовать добавить цифры в конце ключа «файл»

5
задан Leonel 26 November 2008 в 12:25
поделиться

5 ответов

Для массива объектов ArrayList:

ArrayList obj[10];

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

Рассмотрите также:

std::vector<ArrayList> obj(10, ArrayList());

Это инициализирует объекты путем копирования независимо от того, что Вы передаете как второй параметр. Таким образом, они являются всеми одинаковыми, но не обязательно по умолчанию. И поскольку litb указывает, "10" в векторе может быть заменен непостоянным выражением, тогда как "10" в объявлении массива не может.

Это на самом деле не помещает объекты ArrayList на стек, он помещает все 10 в единственное выделение от "кучи". Таким образом, могут очень редко быть проблемы производительности, если Вы действительно не можете позволить себе единственное выделение. Однако станд.:: вектор находится на стеке, и он удаляет любые объекты "кучи", которые он использует, когда он уничтожается. Таким образом в целях удостовериться Ваши ресурсы освобождены, вектор ведет себя, "как будто" это были все на стеке.

Обратите внимание, что смешивание контейнера Объекта, со значениями ArrayList, поскольку Вы делаете в своем коде Java в качестве примера, чревато опасностью в C++. В основном Вы не можете сделать этого, даже если бы ArrayList расширяет Объект, потому что массив только содержал бы устройство хранения данных для 10 Объектов, и ArrayList, вероятно, требует, чтобы больше байтов сохранило, чем Объект. Результат состоит в том, что любой ArrayList, который Вы пытаетесь скопировать в массив, "нарезать": только начальная часть его представления помещается в массив.

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

3
ответ дан 18 December 2019 в 09:10
поделиться

Просто объявление

Object array_of_objects[10];

в C++ создает 10 созданных из значения по умолчанию объектов текстового объекта на стеке.

Если Вы хотите использовать конструктора не по умолчанию, это не так легко в C++. Мог бы быть путь с новым размещением, но я не мог сказать Вам первое, что пришло на ум.

Править: Свяжитесь с другим вопросом на StackOverflow, Как использовать размещение, новое для массива, объяснен в ответе на этот вопрос здесь на StackOverflow.

5
ответ дан 18 December 2019 в 09:10
поделиться

В C++ не возможно иметь массив на стеке с размером, определенным во времени выполнения. Здесь Вы используете станд.:: вектор, чтобы сделать это:

int N = 10;
std::vector<Object> obj(N);
// non-default ctor: std::vector<Object> obj(N, Object(a1, a2));
// now they are all initialized and ready to be used

Если размер известен во время компиляции, можно просто продолжить простой массив:

int const N = 10;
Object obj[N];
// non-default ctor: Object obj[N] = 
//     { Object(a1, a2), Object(a2, a3), ... (up to N times) };
// now they are all initialized and ready to be used

Если Вам разрешают использовать повышение, лучше использовать повышение:: массив, так как это обеспечивает итераторы как контейнеры, делает, и Вы сможете получить его размер с помощью .size ():

int const N = 10;
boost::array<Object, N> obj;
// non-default ctor: boost::array<Object, N> obj = 
//     { { Object(a1, a2), Object(a2, a3), ... (up to N times) } };
// now they are all initialized and ready to be used
4
ответ дан 18 December 2019 в 09:10
поделиться

Выделение может быть сделано 'статически' (размер, известный во время компиляции) или 'динамично' (размер, определенный во время выполнения).

Статическое выделение является простым

int myarray[10];

Для выделения на стеке Вам нужно alloca функция выделения, которая по существу просто увеличивает указатель вершины стека. (или декременты... безотносительно). Освобождение сделано автоматически.

int* myarray = (int*) alloca( n*sizeof(int) );

Таким образом, можно инициализировать массив на стеке как Nils, показал.

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

Мое предположение - то, что Повышение делает просто это.

4
ответ дан 18 December 2019 в 09:10
поделиться

Можно даже выделить переменные числа объектов на стеке. Необходимо смешать C и C++, чтобы сделать так все же.

// allocate storage for N objects on the stack
// you may have to call _alloca and include something to use this.
object * data = (object *) alloca (N * sizeof (object));

// initialize via placement new.
for (int i=0; i<N; i++)
  new (&data[i])();

Код не тестируется, но в принципе он прокладывает себе путь.

2
ответ дан 18 December 2019 в 09:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: