名前付きコンストラクターがいくつかあるクラスがいくつかあります。それらから継承する場合、コンストラクターをどのように継承する必要がありますか?問題は、子クラスではなく基本クラスのオブジェクトを返すことです。
副次的な質問:ボイラープレートコードの量を減らすために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> ();
名前付きctorはイディオムであり、実際のコンストラクターではありません。厳密に言えば、名前付きctorはstatic
関数に依存します。継承にはvirtual
機能が必要です。現在、非メンバーは仮想化できないため、static virtual
機能を持つという考えは除外されています。
副次的な質問:ボイラープレートコードの量を減らすためにC ++ 0xを「使用」して使用できますか?
using
宣言は、基本クラスctorのall -or-noneを継承するようにコンパイラーに要求します。ですから、そうです、彼らはあなたのコードを単純化することができます。ただし、すべてのコンパイラはC ++ 0xをサポートしていますか?
「クラシック」コンストラクターを継承しないことも、「名前付き」コンストラクターを継承することもありません。派生クラスごとに特定のコンストラクターを作成する必要があります。
名前付きコンストラクターを継承で使用する方法の例を次に示します。
class SpiralPoint: public Point{
private: SpiralPoint(float t, float r)
:Point(Point::polar(r*t, t)) { };
};
(ほぼ)完璧な解決策を見つけました!
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