命名构造函数的习惯用法和继承

时间:2009-10-27 20:28:38

标签: c++ named-constructor

我有一些课程有一些named constructors。当我继承它们时,我应该如何继承构造函数?问题是它们返回基类的对象而不是子类的对象。

附带问题:我可以使用C ++ 0x“使用”来减少样板代码的数量吗?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您既不继承“经典”构造函数,也不继承“命名”构造函数。您应该为每个派生类创建特定的构造函数。

这是一个例子,命名构造函数如何与继承一起使用:

class SpiralPoint: public Point{
  private: SpiralPoint(float t, float r)
     :Point(Point::polar(r*t, t))  { };
};

答案 2 :(得分:1)

命名ctor是一个成语,它们 不是真正的构造函数 。严格来说,命名的ctors依赖于static函数。继承需要virtual个函数。现在,非成员不能是虚拟的,因此排除了static virtual函数的想法。

  

附带问题:我可以使用C ++ 0x“使用”来减少样板代码的数量吗?

using声明要求编译器继承基类ctors的 all-or-none 。所以,是的,他们可以简化你的代码。但是,您的所有编译器都支持C ++ 0x吗?

答案 3 :(得分:0)

我发现(几乎)完美的解决方案!

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