Это зависит от того, хотите ли вы поделиться вектором underyling или нет. В целом, я думаю, что хорошей практикой является избегать обмена там, где это возможно, так как это снимает вопрос о владении объектом. Без обмена:
class ListHandler
{
public:
ListHandler(const std::vector<int>& list) : _list(list) {}
~ListHandler(){}
private:
std::vector<int> _list;
};
Обратите внимание, что, в отличие от вашего примера, я делаю это const
, поскольку оригинал не будет изменен. Однако, если мы хотим держаться и совместно использовать один и тот же базовый объект, то мы можем использовать что-то вроде этого:
class ListHandler
{
public:
ListHandler(std::vector<int>& list) : _list(&list) {}
~ListHandler(){}
private:
std::vector<int>* _list;
};
Обратите внимание, что в этом случае я предпочитаю оставить вызывающую сторону в качестве владельца объекта (так что ответственность вызывающей стороны заключается в том, чтобы гарантировать, что список существует в течение всего времени существования объекта обработчика списка и что список позднее освобождается ). Ваш пример, в котором вы переходите во владение, также возможен:
class ListHandler
{
public:
ListHandler(std::vector<int>* list) : _list(list) {}
ListHandler(const ListHandler& o) : _list(new std::vector<int>(o._list)) {}
~ListHandler(){ delete _list; _list=0; }
ListHandler& swap(ListHandler& o){ std::swap(_list,o._list); return *this; }
ListHandler& operator=(const ListHandler& o){ ListHandler cpy(o); return swap(cpy); }
private:
std::vector<int>* _list;
};
Хотя вышесказанное, безусловно, возможно, мне лично это не нравится ... Мне кажется странным, что объект, который не является просто классом интеллектуального указателя, получает право владения указателем на другой объект. Если бы я делал это, я бы сделал это более явным, обернув std :: vector в контейнер интеллектуальных указателей, например:
class ListHandler
{
public:
ListHandler(const boost::shared_ptr< std::vector<int> >& list) : _list(list) {}
~ListHandler(){}
private:
boost::shared_ptr< std::vector<int> > _list;
};
Я нахожу вышеупомянутое намного более ясным в сообщении собственности. Однако все эти различные способы передачи списка приемлемы ... просто убедитесь, что пользователи знают, кому что будет принадлежать.