我有一些带有一些命名构造函数的类。当我从它们继承时,我应该如何继承构造函数?问题是它们返回基类的对象而不是子类的对象。
附带问题:我可以使用 C++0x“使用”来减少样板代码的数量吗?
我有一些带有一些命名构造函数的类。当我从它们继承时,我应该如何继承构造函数?问题是它们返回基类的对象而不是子类的对象。
附带问题:我可以使用 C++0x“使用”来减少样板代码的数量吗?
struct Foo {
template<typename T> static T one () { return T(1); }
};
struct A { int x; A(int i) : x(i) {}};
struct B : A { B(int i) : A(i) {}};
这使您可以执行以下操作
A a = Foo::one<A> ();
B b = Foo::one<B> ();
您既不会继承“经典”构造函数,也不会继承“命名”构造函数。您应该为每个派生类创建特定的构造函数。
这是一个示例,命名构造函数如何与继承一起使用:
class SpiralPoint: public Point{
private: SpiralPoint(float t, float r)
:Point(Point::polar(r*t, t)) { };
};
命名 ctor 是一个习惯用法,它们不是真正的构造函数。严格来说,命名的 ctor 依赖于static
函数。继承需要virtual
函数。现在,非成员不能是虚拟的,因此static virtual
排除了具有函数的想法。
附带问题:我可以使用 C++0x“使用”来减少样板代码的数量吗?
该using
声明要求编译器继承所有或不继承所有基类ctor。所以,是的,他们可以在某种程度上简化你的代码。但是,您的所有编译器都支持 C++0x 吗?
我找到了(几乎)完美的解决方案!
template <class T>
class Color {
public:
static T Red () { return T (0); }
static T Green () { return T (1); }
static T Blue () { return T (2); }
protected:
explicit Color (int raw) : raw (raw) {
}
private:
int raw;
};
class MoreColor : public Color <MoreColor> {
public:
static MoreColor Octarina() { return MoreColor(8); }
private:
friend class Color <MoreColor>;
explicit MoreColor (int raw) : Color <MoreColor> (raw) {}
};
void Test() {
MoreColor o = MoreColor::Octarina();
MoreColor r = MoreColor::Red();
}
它编译:D