2014-02-13 4 views
0

Пример: у меня есть класс CarPool, который создает много объектов Car. Он хранит их в vector<Car*> all_cars_;Использование новых интеллектуальных указателей в коллекциях std

Car класс фактически является базовым типом множества различных типов автомобилей (так vector<Car> не будет работать, как я понимаю).

У меня есть некоторые Person объекты, которые могут иметь доступ к некоторым из этих автомобилей. Класс Person хранит их в vector<Car*> my_cars_;.

Объект CarPool всегда будет переживать объекты Person и поэтому несет ответственность за владение. Из-за этого я думал о создании коллекции CarPool в vector<unique_ptr<Car>> all_cars_;

Следует ли обновлять классы Person? Если да, то какова должна быть коллекция all_cars_? Или они должны оставаться в качестве указателей старой школы? Старые школьные указатели все еще являются «современным» способом обращения к объектам?

+2

Хм, я бы предпочел просто «вектор », если это возможно. –

+0

@R. Martinho Fernandes Я согласен, но я ожидаю, что Car может быть базовым классом для различных различных производных типов автомобилей, и в этом случае доступ к ним с помощью указателя необходим, чтобы избежать нарезки. – YoungJohn

+0

@R. На самом деле это базовый тип. Однако, если это не так, и я сделал вектор в классе CarPool, что бы у вас было в классе Person? – neiled

ответ

0
vector<unique_ptr<Car>> all_cars_; 

звуки идеально подходят для вашего применения. Кому принадлежит all_cars, то также принадлежит все Car* s в all_cars. И это будет выше:

vector<Car*> all_cars_; 

, по крайней мере, 2 причинам:

  1. вам не придется беспокоиться о коде собственности памяти больше.
  2. Компилятор не даст вам случайно получить более одного объекта, принадлежащего любому из указателей, в all_cars_.

Для:

vector<Car*> my_cars_; 

это звучит, как это , не владеющие указателями. И так держать их как Car* вполне разумно. Это также позволяет вам свободно копировать любой из этих указателей. Единственное, что вам нужно будет отслеживать, это недействительность указателей из-за изменений в all_cars_, которые вы, безусловно, уже управляете своим текущим дизайном.

Смежные вопросы