Является ли это допустимым решением проблемы конструктора с миксинами? - PullRequest
1 голос
/ 22 июня 2011

Как я понимаю, существует проблема с миксинами, когда, если вы хотите использовать что-то кроме конструктора без аргументов, объекты, на которых вы используете свой миксины, должны будут иметь общую сигнатуру конструктора или использовать инициализатор.методы в классах, с которыми вы хотите использовать миксин.

Кажется, это своего рода обходной путь, хотя я не уверен, что есть ситуации, в которых он потерпит неудачу.Это делает миксин более похожим на декоратор, но устраняет необходимость в общем интерфейсе, от которого наследуются декораторы.Я предполагаю, что другая проблема в том, что синтаксис может стать неуклюжим?

Просто хочу знать, есть ли что-нибудь ужасно опасное в этом.Я также хотел бы знать, если бы я, будучи не очень умным программистом, неправильно понял эту проблему с миксинами.

Редактировать: это, кажется, лучшая формулировка.конструктор

оформленный

x = 777, производный

Ответы [ 2 ]

3 голосов
/ 22 июня 2011
  1. Вы теряете память, если во время создания возникает исключение,
  2. В базовом классе должен быть конструктор по умолчанию, который должен быть создан сначала, а затем назначен.

Лучше сделать:

Decorator(const T& initializer) : T(initializer)
{
}

и использовать:

Decorator<Base> d1((Base()));
Decorator<Base> d2(Base("decorated"));
Decorator<Derived> d3(Derived("derived",777));

Также в C ++ 0x вы можете передавать абсолютно любое количество аргументов из конструктора Decorator в базовый конструктор, эффективно делаяиспользование как обычно:

Decorator<Base> d1;
Decorator<Base> d2("decorated");
Decorator<Derived> d3("derived",777);
3 голосов
/ 22 июня 2011

Это причина, по которой в C ++ 0x появилась возможность безопасно пересылать произвольное количество элементов:

template <typename T>
struct Decorator: T
{
  template <typename... Args>
  Decorator(Args&&... args): T(args...) {}
};

, которое корректно пересылает аргументы.Проверьте это на ideone !

...