artbear писал(а) 24. Сентября 2007 :: 05:48:Я использую замечательные смартпойнтеры - sh_ptr, sh_array. Написаны они не мной, но пока полностью меня устраивают.
Это потому, что ты бустовских не видел.
artbear писал(а) 24. Сентября 2007 :: 05:48:По сравнению с бустовскими они сильно упрощены, но в принципе почти весь функционал соблюден.
"Почти весь" - слишком сильно сказано. Более того, в указанных тобой классах нет минимально необходимого функционала. Например:
1) Нет корректного приведения к булевому типу (это не просто operator bool (), но даже его нет).
2) Нет аналогов static_cast, dynamic_cast и const_cast для смартпойнтера.
3) Нет оператора <, а значит нет возможности хранить указатели в std::map.
4) Самого по себе этого указателя не достаточно. Как минимум еще нужен аналог boost::scoped_ptr.
Ну, а вот что касается фичастости:
1) Возможность передать в смартпойнтер указатель на производный класс. При этом объект будет корректно удален даже в случае, когда у базового класса нет виртуального деструктора.
2) Возможность переопределить операцию удаления. Что позволяет использовать смартпойнтер для автоочистки ресурсов, не являющихся памятью. Вот пример
отсюда typedef shared_ptr<void> handle;
handle createProcess()
{
shared_ptr<void> pv(CreateProcess(), CloseHandle);
return pv;
}
При удалении последнего смартпойнтера будет автоматически вызван CloseHandle. Также можно просто заставить смартпойнтер выполнить некоторых завершающий код (без удерживания какого-либо указателя) - при выходе из блока.
3) shared_ptr удачно взаимодействует с weak_ptr, который содержит указатель на объект, но не препятствует его удалению. Когда будет удален последний shared_ptr, все weak_ptr инвалидируются.
Что же касается класса sh_array, то он вообще не имеет права на существование. В стандартной библиотеке есть просто замечательный класс std::vector, который по всем параметрам лучше обычных массивов в стиле C. Поэтому работать с массивами при помощи new CObject [N] - просто нет никакого смысла.
artbear писал(а) 24. Сентября 2007 :: 05:48:Но можешь выслать мне хедеры бустовских смартпойнтеров, вычленив их из буста?
Чисто смартпойнтеры выдирать не так просто (есть вроде какой-то специальный утиль для этого...). Могу прислать всю директорию с заголовками (<2mb).
artbear писал(а) 24. Сентября 2007 :: 05:48:Uzhast писал(а) 23. Сентября 2007 :: 04:59:Для доработки я выбрал версию 2.5. Потому что, глянув на код в 2.0.3, решил, что это будет проще
Хотя, в итоге, думаю перенести поддержку провайдера в 2.0.3. Ночные сборки меня по прежнему не вдохновляют. Особенно, в свете последних изменений, связанных с параметрами по умолчанию.
А чем тебе эти правки не нравятся?
Тем, что ломают работающий промышленный код
и приводят к тому, что функции 1С++ ведут себя не так, как принято в 1С повсеместно.
Во-первых. Например, раньше можно было писать ИндексированнаяТаблица.ВыбратьСтроку (). А теперь нельзя. Можно только, например, ИндексированнаяТаблица.ВыбратьСтроку (0). Так же видел, что кто-то еще жаловался на такое поведение с параметрами по умолчанию.
Во-вторых, подобное поведение не соответствует стандартному. Если я пишу
Процедура ХитроеСложение (А = 2, Б = 3)
То я могу вызывать ее как ХитроеСложение (3). И мне не надо писать ХитроеСложение (3,). А в 1С++ надо