第14章 コンポジション


クラスは、メンバにオブジェクトを持つことができます。 この方法により、新しいクラスを作ることを コンポジション(composition 合成という意味)と いいます。

うーん、次々といろんな言葉が出てきて難しいな・・

暗記する必要はありません。こんな言葉があったな位で いいと思います。大事なことは、たださらっと読むだけではなく 必ず、自分でソースを書いてビルドする事です。 そして、うまくプログラムができたら、最初のソースを いろいろ書き換えてみてください。「あー、こうすれば エラーになるんだな」とかいろんなことがわかってきます。 ともかく、頭より体で覚えましょう。

#include <iostream.h> class Moto { public: int moto_x; int moto_y; Moto(); }; class Composition { public: Moto moto; //メンバオブジェクトです }; Moto::Moto() { moto_x = 10; moto_y = 20; } int main(void) { Composition x; cout << "x.moto.moto_x= " << x.moto.moto_x << endl; cout << "x.moto.moto_y= " << x.moto.moto_y << endl; return 0; }


メンバオブジェクトの使い方も、上の例を見ると 大して難しくはないですね。でもここでちょっとやっかいなことがあります。 次の例題を考えてみてください。

もし、motoクラスのコンストラクタが引数を取る場合次のように書いたら どうなるでしょう。

class Composition { public: Moto moto(5); };

これは、エラーになります。 少し例題を書き直してみますのでよく見て どこが違うのか検討してみてください。

#include <iostream.h> class Moto { public: int moto_x; Moto(int x); }; class Comp { public: int comp_x; Moto a; //Motoクラスのコンストラクタが //引数を取るときでも必ずこのように書く //Moto a(10);などはエラーとなる Comp(); }; //Compクラスのコンストラクタのところで //a(10)というように記述すること Comp::Comp():a(10) { comp_x = 0; } Moto::Moto(int x) { moto_x = x; } int main(void) { Comp c; cout << "c.a.moto_x = " << c.a.moto_x << endl; return 0; }

わかったでしょうか。Compコンストラクタのところで

Comp::Comp():a(10)

{.......}

のように記述します。 これをメンバイニシャライザといいます。

今回は、少し面倒なことをやりました。しばらくは、 こんな面倒なことは出てきませんので安心してください。


[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Jan/15/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。