class FooЧлены A и B сами позаботятся о своем копировании: A сделает deep copy своего содержимого в новый объект, B будет вести подсчет ссылок.
{
std::vector<Bar> A;
boost::shared_ptr<Bar> B;
};
Однако, почему-то в популярных (STL и boost) библиотеках нет умного указателя, аналогичного shared_ptr, но не с подсчетом ссылок, а с глубоким копированием. То есть чтобы он указывал на один (или ноль, если SmartPointer=NULL) объект, а не как vector - на массив. Подходящий указатель есть в Loki, благо там все разбито по стратегиям и можно задать любую стратегию копирования (подсчет ссылок, глубокое копирование, ...). Однако лишний раз иметь зависимость от Loki не всем удобно. Писать свой велосипед - еще менее удобнее. Компромисный вариант: использовать std::vector, кладя в него не больше одного элемента. Звучит смешно, но работает.
2 комментария:
Чем вектор с одним элементом лучше самого объекта в качестве мембера? =)
Если объект в качестве мембера, то он должен существовать всегда. Представь ситуацию, когда размер объекта (мембера) большой, а нужен он бывает редко.
А в случае вектора можно реализовать pointer = NULL через vector.clear().
Отправить комментарий