Рассмотрим этот «дизайн» (детали реализации опущены):Как я могу улучшить способ создания этого объекта?
struct service {};
struct sub {
sub(service&) {}
service& s_;
};
struct sub_a: sub {
sub_a(service&) {}
};
struct sub_b: sub {
sub_b(service&) {}
};
struct top {
service svc_;
sub_ptr sub_;
};
В принципе, мой top
объект содержит sub_ptr
, но экземпляр принадлежит этому указателю необходим доступ к svc_
для того, чтобы инстанциируемый, который также находится в top
. Однако, я хочу, чтобы пользователь top
был в состоянии выбрать тип sub
(здесь sub_a
или sub_b
), не предоставляя по телефону svc_
.
Мое решение до сих пор, чтобы мой конструктор top
, как это:
template <typename SubType>
top(std::unique_ptr<SubType>): sub_(new SubType(svc_)) {}
Вот является использование:
auto t = top(std::unique_ptr<sub_b>());
Но я не чувствую, что это решение элегантно. Я мог бы написать функции (например, make_top_sub_b()
), чтобы скрыть детали, но мне было интересно, как я мог избежать указания фиктивного указателя на мой конструктор? Создание top
шаблоном не является вариантом.
Любая идея, как я мог бы улучшить это? Спасибо,
Насколько я вижу, это выглядит как проблема, решаемая шаблоном Factory. Простая версия шаблона Factory - это делегировать конструкцию вашего типа функции, которую вы предлагаете с помощью 'make_top_sub_b'. Я бы сказал, что вы на верном пути. – YoungJohn