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

名前付きctorはイディオムであり、実際のコンストラクターではありません。厳密に言えば、名前付きctorはstatic関数に依存します。継承にはvirtual機能が必要です。現在、非メンバーは仮想化できないため、static virtual機能を持つという考えは除外されています。

副次的な質問:ボイラープレートコードの量を減らすためにC ++ 0xを「使用」して使用できますか?

using宣言は、基本クラスctorのall -or-noneを継承するようにコンパイラーに要求します。ですから、そうです、彼らはあなたのコードを単純化することができます。ただし、すべてのコンパイラはC ++ 0xをサポートしていますか?

于 2009-10-27T20:53:48.103 に答える
1

「クラシック」コンストラクターを継承しないことも、「名前付き」コンストラクターを継承することもありません。派生クラスごとに特定のコンストラクターを作成する必要があります。

名前付きコンストラクターを継承で使用する方法の例を次に示します。

class SpiralPoint: public Point{
  private: SpiralPoint(float t, float r)
     :Point(Point::polar(r*t, t))  { };
};
于 2009-10-27T20:34:18.363 に答える
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 に答える