RAII и C++ STL

У меня есть случай, где я хочу сохранить список ресурсов в станд.:: вектор. Поскольку я вижу его, мои опции следующие:

  1. Дайте моему ресурсу конструктора по умолчанию
  2. Сохраните их, поскольку "куча" возражает (и перенесите их в общий указатель),

Опция 1 позволяет создать недопустимые ресурсы, и опция 2 вынуждает меня использовать "кучу".

Я пропускаю какие-либо опции здесь?

5
задан dirk 5 March 2010 в 07:26
поделиться

3 ответа

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

Единственное ограничение - вы не можете использовать vector :: resize с аргументом по умолчанию, если у класса нет конструктора по умолчанию.

vec.resize(20);  // requires default constructor

но вы можете указать vector :: resize объект по умолчанию:

std::vector<foo> vec;
vec.resize(20, foo(10));  // give a sample object since foo has not default constructor
7
ответ дан 14 December 2019 в 01:06
поделиться

Вы можете хранить объекты с нетривиальным конструктором в векторе. Хранение объектов в контейнерах stl должно иметь семантику присваивания (конструктор копирования и оператор присваивания).

1
ответ дан 14 December 2019 в 01:06
поделиться

Третьим вариантом было бы использование Boost.PointerContainer. Однако ваши объекты все равно будут выделяться на куче по отдельности. Как заметил Йоханн, std::vector уже использует кучу для хранения объектов (смежно), поэтому нет способа полностью избежать кучи.

Часто не имеет смысла позволять ресурсам (таким как мьютексы, потоки ввода/вывода и т.д.) иметь семантику копирования. Поэтому их нужно сделать некопируемыми, сделав конструктор копирования и оператор присваивания частными. К сожалению, ограничение на некопируемость делает невозможным хранение ресурсов непосредственно как значений внутри контейнеров STL. Поэтому приходится прибегать либо к Boost.PointerContainer, либо к контейнерам умных указателей. В разделе Мотивация документации по Boost.PointerContainer объясняется, почему лучше использовать один из них, а не другой.

1
ответ дан 14 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

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