据我所知,mixin存在一个问题,如果你想使用除无参数构造函数之外的东西,那么你使用你的mixin的对象必须有一个公共的构造函数签名,或者你必须使用初始化方法在你想使用mixin的类中。这是一个有效的解决方法,以mixin的构造问题?
这似乎是一种解决方法,虽然我不确定是否有情况会导致失败。它使得mixin更像一个装饰器,但它消除了装饰器继承的通用接口的需要。我想另一个问题是,语法可能变得笨重?
只是想知道这是否有什么可怕的危险。我也想知道,作为一个不太聪明的程序员,我是否用mixin误解了这个问题。
编辑:这似乎是一个更好的公式。
class Base
{
protected:
std::string name;
public:
Base()
{
name = "no arg constructor";
}
Base(std::string n)
{
name = n;
}
virtual void doSomething()
{
cout << name << "\n";
}
};
class Derived : public Base
{
private:
int x;
public:
Derived(std::string n, int i) : Base(n)
{
x = i;
}
void doSomething()
{
cout << "x = " << x << "\t";
Base::doSomething();
}
};
template <class T>
class Decorator : public T
{
public:
Decorator(const T& initializer) : T(initializer)
{
//*static_cast< T* >(this) = *initializer;
//delete initializer;
}
};
void method(Base& b)
{
b.doSomething();
}
int main()
{
Base b;
Decorator<Base> d1(b);
Decorator<Base> d2(Base("decorated"));
Decorator<Derived> d3(Derived("derived", 777));
method(d1);
method(d2);
method(d3);
return 0;
}
没有参数构造
装饰
X = 777衍生
@Martin:你是什么意思b合法吗? – user487100
@Martin:不是,虽然我会用两个阶段的方法:'T&me = * this; me = * initializer;'因为'static_cast'在这个方向上是不必要的。 –
@Matthieu:这样行为>是
user487100