2016-03-29 2 views
0

С:Ссылки на производный классе unique_ptr в векторе

std::unique_ptr<base> master_list; 
std::vector<derived*> sub_list; 

таким образом, что подмножество master_list создаются:

(1) извлечение из master_list использования .get() (2) литой к производному классу с использованием dynamic_cast (3) добавить литой необработанный указатель на sub_list (4) Использовать из под-списка, если необходимо

Вы видите ошибку в этом подходе? это скорее лучше:

(1) извлечение из master_list использования .get() (2) добавить сырой указатель на sub_list (3) извлечь из sub_list при необходимости (4) приведения к производному классу с помощью dynamic_cast

+0

Какая связь между «базой» и «производной»? Потому что, если это то, что вы, кажется, предполагаете, значит, вы либо имеете что-то назад, либо ошибочно выполняете полиморфизм. –

ответ

0

Оба подхода выглядят правильно для меня, если у каждого dynamic_cast логика правильно относится к случаю, когда dynamic_cast возвращает nullptr.

Во втором случае это означает, что, когда вы решаете, что вам нужно что-то, на самом деле его не может быть (если dynamic_cast возвращает nullptr).

Предполагая, что вопросы, связанные с обоими подходами, разработаны для обоих подходов, наилучший подход будет зависеть от ожидаемого использования sub_list[i] для вашего «среднего» i. Если ожидается, что большинство членов sub_list будут использоваться более одного раза, это лучше всего, как у вас есть (первый способ).

Обоснование: dynamic_cast не является бесплатным. В первом подходе вы dynamic_cast один раз для каждого sub_list[i], а затем можете использовать его несколько раз.

Во втором подходе вы должны использовать dynamic_cast один раз за использование. Это выиграет в случае, если вы можете поместить указатели в sub_list, а затем позже решите не использовать их. Если это случается очень часто, вы можете избежать необходимости в dynamic_cast для этих указателей, перемещенных, но не используемых.

Если вы всегда используете каждый указатель, помещенный в sub_list ровно один раз, два подхода должны быть идентичными по производительности (и правильности).