2016-02-02 7 views
1

У меня есть class A, который не является ни копируемым, ни назначаемым. Теперь я хочу еще class B провести вектор объектов A. Также ясно, что B владеет правами на эти объекты.vector <A> vs vector <A*> vs vector <shared_ptr <A>> in C++

Как я вижу, есть (по крайней мере) три варианта:

  1. использование vector<A>
  2. использование vector<A*>
  3. использование vector<shared_ptr<A> >

Правильно ли это, что: 1. не работать, потому что A не копируется конструктивно/присваивается?

Мне не нравится 2. потому что я должен убедиться, что снова удалю указатели.

Если я использую 3. Я чувствую, что это не означает, что B является владельцем объектов A. Также я столкнулся с проблемой, что, если я хочу, чтобы пользователи B удалили указатели с этого вектора, им нужно передать элемент, который они хотят удалить, на shared_ptr<A>, правильно?

В этом случае было бы чистое дизайнерское решение? Есть ли хорошие ссылки на это?

+2

Является ли мобильным? 4. 'std :: unique_ptr', поскольку вы не являетесь владельцем судна. – Jarod42

+0

[std :: vector :: emplace_back] (http://en.cppreference.com/w/cpp/container/vector/emplace_back) – Drop

+0

Что вы хотите сделать с вашим вектором 'A'? Это основной вопрос, который вы должны задать себе перед тем, как выбрать, какой из них является правом на использование. – Holt

ответ

2
  1. Исправить; A должен быть copy-assignable and copy-constructible, который будет использоваться с std::vector, но с C++ 11 on это сильно зависит от операций, которые вам нужно использовать на векторе.
  2. Я согласен, я больше не буду использовать исходные указатели, если у меня не будет очень убедительной причины (и это не одно, на мой взгляд).
  3. Вы считаете unique_ptr? Там есть хороший blog post.
+0

Хорошая ссылка. Означает ли это, что я обычно передавал бы 'const unique_ptr (A) &' вместо 'A *' или 'const A &'? – Elrond1337

+0

Хм, в зависимости от вашего варианта использования, я думаю, но если вам действительно нужно пройти вокруг указателей (даже вне вашего 'B'), возможно, вы вместо этого используете' smart_ptr'. Я бы либо сделал это, либо просто передал 'const A &' around. Комментарий Холта к вашему вопросу имеет правильную идею - возможно, вам нужно уточнить ваши варианты использования. – mindriot

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