2011-06-07 17 views
0

私はこれを持っている:罰金ですが、私は、クラスFOOを修正せずに過負荷をいくつかの演算子を追加したいサブクラスと使用ベースクラス初期化子

class foo { 
public: 
    int a; 
    int b; 
    int c; 
}; 

class bar: public foo { 
    operator==(const bar &x) const { 
    return a == x.a; 
    } 
} 

ファイン今のところ、今私は別のクラスから取得するオブジェクトの配列でバーを初期化する必要があります。

bar::bar(foo &x) { 
    a = foo.a; 
    /* etc */ 
} 

をしかし、これは厄介なようで、クラスfooの場合は更新される上で、その後、私はあまりにもバーを更新する必要があります:いいえ問題は、私だけのfoo変数の全てが終わっ専用のコンストラクタでバーにコピーすることはできません。多くの望ましいバーは自動的に初期化する(それは、独自のデータメンバーが含まれていることは決してないだろう)簡単

答えて

1

まあ、できれば:

bar::bar(const foo& x) 
    : foo(x) 
{ 
} 

だけfoo年代を使用するコンストラクタをコピーします。 :{の間のすべては、イニシャライザリストと呼ばれます。そこにメンバーと基底クラスを直接初期化することができます。 fooについては、コピーコンストラクタは次のようになります。私はあなたが他のオブジェクトに触れていないので、良い習慣ですconst参照によって両方の引数を取る

foo::foo(const foo& other) 
    : a(other.a) 
    , b(other.b) 
    , c(other.c) 
{ 
} 

注意。 fooのコピーコンストラクタを書くことは、ほとんどの場合、クラスに生ポインタ(例えばint*)が含まれている場合にのみ必要です。コンパイラは、定義しておらず、すべてのデータメンバのシャローコピーを作成するだけで、コピーctor自体を生成します。

2

が、それはfooがコピーコンストラクタを持っていることを確認することほど簡単ではありません.......コンストラクタを継承

bar::bar(foo &x) 
: foo(x) 
{ 
} 

class foo { 
foo::foo(foo &x) 
{ 
    a = foo.a; /* etc */ 
} 

}; 
+0

'foo'は、質問にあるように、既定のコピーコンストラクタを既に持っています。あなたは何も追加する必要はありません、それを呼び出すだけです。 –

+0

私はもう一度それを読んで、Fooにはコピーコンストラクタが既にあるとは言いません。 私は彼の例でFooの関連するクラス定義全体を印刷したという印象を受けました。 – NotJarvis

+0

クラスが質問のように見える場合、コンパイラはすべての要素のメンバーワイズコピーを行い、そのためのデフォルトのコピーコンストラクタを生成します。 –

0

はC++ 03で行うことはできませんが、近似することができます。

template<class T1> bar(const T1& x1) : foo(x1) {} 
template<class T1, class T2> bar(const T1& x1, const T2& x2) : foo(x1, x2) {} 
template<class T1, class T2, class T3> bar(const T1& x1, const T2& x2, const T3& x3) : foo(x1, x2, x3) {} 
// as much as you need... 

C++ 0xでは、1つの可変テンプレートテンプレートコンストラクタと完璧な転送を使用します。

+1

* Huh *?派生クラスを基本クラスから初期化できるようにしたいのであれば、C++ 03でも可能です。 – Xeo

+0

@Xeo:コピー初期化 - 可能。コンストラクタを継承する - 不可能。新しいメソッドで 'vector'を拡張しようとして、問題が何であるかを見てみましょう... – ybungalobill

+0

とにかく、OPが望んでいたのは正確にはそうではありません...(しかし、彼の問題も解決しますが)。 – ybungalobill

関連する問題