Расширение комментария до правильного ответа ...
Основной проблемой здесь является право собственности.Из вашего кода выясняется, что каждый экземпляр messenger
владеет своим собственным экземпляром принтера - но фактически вы передаете предварительно созданный принтер (предположительно, с некоторым дополнительным состоянием), который затем необходимо скопировать в свой собственный экземплярprinter
.Учитывая подразумеваемую природу объекта printer
(то есть для печати чего-либо), я бы сказал, что то, для чего он печатает, является общим ресурсом - в этом свете, для каждого экземпляра messenger
нет смысла иметьэто собственная копия printer
(например, что если вам нужно заблокировать доступ к std::cout
)?
С точки зрения дизайна, то, что нужно messenger
для построения, на самом деле является указателемк некоторому общему ресурсу - в этом свете shared_ptr
(еще лучше, weak_ptr
) - лучший вариант.
Теперь, если вы не хотите использовать weak_ptr
, и вы былучше хранить ссылку, подумайте, можете ли вы соединить messenger
с типом printer
, связь оставлена для пользователя, вам все равно - конечно, основным недостатком этого является то, что messenger
не будетбыть сдерживаемым.ПРИМЕЧАНИЕ. Вы можете указать класс признаков (или политики), для которого можно набирать messenger
, и это предоставляет информацию о типе для принтера (и может контролироваться пользователем).
Третий вариант - еслиу вас есть полный контроль над набором принтеров, и в этом случае вы держите тип варианта - это намного чище ИМХО и позволяет избежать полиморфизма.
Наконец, если вы не можете соединиться, вы не можете управлять принтерами, и вы хотите свой собственныйэкземпляр printer
(того же типа), шаблон конструктора преобразования - это путь вперед, однако добавьте disable_if
, чтобы предотвратить его неправильный вызов (т. е. как обычное копирование ctor).
All-in-все я бы относился к принтеру как к общему ресурсу и держал бы weak_ptr
как откровенно говоря, это позволяет лучше контролировать этот общий ресурс .