Я использую boost :: ptr_vector вместо просто std :: vector, так как он будет обрабатывать удаление всех указателей для меня. Однако, когда я делаю:
ptr_vector<SoftLabelRandomTreeFunctor> functors;
functors.resize(number_of_functors);
Жалуется что SoftLabelRandomTreeFunctor
не имеет конструктора по умолчанию. Тем не менее, у меня сложилось впечатление, что ему просто нужно изменить размер достаточно большой, чтобы соответствовать number_of_functors
* размер указателя на SoftLabelRandomTreeFunctor
не number_of_functors
* размер SoftLabelRandomTreeFunctor
сам?
Я не очень опытен с Boost, так что ответьте мне немного соли. Тем не менее, просматривая документы для boost::ptr_vector
заставил меня думать, что то, что вы хотите (как следует из комментариев к вопросу), должно быть возможно сделать следующим образом:
boost::ptr_vector< boost::nullable<SoftLabelRandomTreeFunctor> > functors;
functors.resize(number_of_functors, 0);
Ссылки для вас, чтобы прочитать и сделать свой собственный вывод:
class nullable
void resize( size_type size, T* to_clone );
— увидеть замечание, что to_clone
может быть 0, если контейнер поддерживает нулиКогда ты пишешь 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
,