3

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

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

4

4 回答 4

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> ();
于 2009-10-27T20:51:13.477 回答
1

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

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

class SpiralPoint: public Point{
  private: SpiralPoint(float t, float r)
     :Point(Point::polar(r*t, t))  { };
};
于 2009-10-27T20:34:18.363 回答
1

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

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

using声明要求编译器继承所有或不继承所有基类ctor。所以,是的,他们可以在某种程度上简化你的代码。但是,您的所有编译器都支持 C++0x 吗?

于 2009-10-27T20:53:48.103 回答
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

于 2009-10-29T01:40:25.247 回答