gpt4 book ai didi

c++ - 这是解决 mixins 构造函数问题的有效解决方法吗?

转载 作者:行者123 更新时间:2023-11-30 00:58:20 25 4
gpt4 key购买 nike

据我所知,mixin 存在一个问题,如果您想使用除无参数构造函数之外的其他东西,您使用 mixin 的对象要么必须具有公共(public)构造函数签名,要么必须使用初始化程序要使用混合的类中的方法。

这似乎是一种解决方法,但我不确定它是否会在某些情况下失败。它使 mixin 更像一个装饰器,但它消除了对装饰器继承的公共(public)接口(interface)的需要。我想另一个问题是语法可能会变得笨拙?

只是想知道这是否有任何可怕的危险。我也想知道,作为一个不太聪明的程序员,我是否误解了 mixins 的这个问题。

编辑:这似乎是一个更好的公式。

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 派生

最佳答案

  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);

关于c++ - 这是解决 mixins 构造函数问题的有效解决方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6440621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com