указатели — C ++: почему для boost :: ptr_vector resize нужен объект, чтобы иметь конструктор по умолчанию

Я использую boost :: ptr_vector вместо просто std :: vector, так как он будет обрабатывать удаление всех указателей для меня. Однако, когда я делаю:

ptr_vector<SoftLabelRandomTreeFunctor> functors;
functors.resize(number_of_functors);

Жалуется что SoftLabelRandomTreeFunctor не имеет конструктора по умолчанию. Тем не менее, у меня сложилось впечатление, что ему просто нужно изменить размер достаточно большой, чтобы соответствовать number_of_functors * размер указателя на SoftLabelRandomTreeFunctorне number_of_functors * размер SoftLabelRandomTreeFunctor сам?

3

Решение

Я не очень опытен с Boost, так что ответьте мне немного соли. Тем не менее, просматривая документы для boost::ptr_vector заставил меня думать, что то, что вы хотите (как следует из комментариев к вопросу), должно быть возможно сделать следующим образом:

boost::ptr_vector< boost::nullable<SoftLabelRandomTreeFunctor> > functors;
functors.resize(number_of_functors, 0);

Ссылки для вас, чтобы прочитать и сделать свой собственный вывод:

3

Другие решения

Когда ты пишешь functors.resize(number_of_functors) Вы потенциально увеличиваете размер вектора, чтобы содержать number_of_functors элементы внутри. поскольку ptr_vector по умолчанию запрещает хранение NULL значения, он должен поместить значимые данные в раздутый массив. Функция намеревается вызвать new SoftLabelRandomTreeFunctor() для каждого нового элемента, и для этого требуется конструктор по умолчанию.

Если вы хотите разрешить NULL, вам нужно boost::nullable По предложению Алексея Куканова, а также в учебнике, включенном в руководство ((Вот)).

Однако, если вы просто намереваетесь зарезервировать достаточно памяти для number_of_functors элементы без семантического их создания и без увеличения размера массива — вам не нужно nullable и вы должны позвонить вместо этого:

functors.reserve(number_of_functors)

Обратите внимание, что после этого вам все равно нужно увеличивать размер массива при добавлении новых элементов (например, через push_back). У вас будет гарантия, хотя это push_back не будет вызывать перераспределение памяти, пока ваш размер не превышает number_of_functors,

1

По вопросам рекламы [email protected]