• ベストアンサー

クラスがメンバーとしてクラスを持つ時の宣言について

自作クラスMainClassがMyClassというクラスをメンバー変数として持つ場合、宣言時に引数をいくつか持つコンストラクタを呼び出そうとすると構文エラーとなります。 class MyClass { public: MyClass(int, int); } class MainClass { private: MyClass myclass(10,10); } このような宣言はできないのでしょうか。 引数なしのコンストラクタは呼び出せているようです。

質問者が選んだベストアンサー

  • ベストアンサー
  • KoHal
  • ベストアンサー率60% (110/181)
回答No.2

クラス定義内でメンバの初期化は出来ません。 例外として static constの整数型メンバのみ初期化が認められていますが。 >引数なしのコンストラクタは呼び出せているようです。 勘違いです。 MyClassのコンストラクタが呼び出されるのはMainClassのコンストラクタ内です。 //MainClassのクラス定義 class MainClass { private:  MyClass myclass; //… }; //MainClassのコンストラクタ定義 MainClass::MainClass() : myclass(10,10) { //… } 初期設定リスト「:myclass(10,10)」を指定しなければMyClassのデフォルトコンストラクタが暗黙に呼び出されます。 なお、MyClassのコンストラクタで引数に初期値を指定しておく手もあります。 MyClass { public:  MyClass(int=10, int=10); //… }; この場合、MainClassのコンストラクタでmyclassの初期設定リストを省略しても所期の結果が得られます。 しかし、初期値を設定した場合でも初期設定を明示することをお勧めしますが。

lilillii
質問者

補足

回答ありがとうございます。 納得できました。ということは、引数が違う物をいくつか作成する場合は、宣言以外のところでnewするか、セッターなどで設定するしかないということですか? あとひとつ気になったのですが、 >static constの整数型メンバのみ初期化が認められています とありますが、現在ヘッダファイルに2次元配列の変数を宣言してincludeしています。 array.h int test[3][3]={{1,2,3},{1,2,3},{1,2,3}}; include "array.h" class MainClass { private:  MyClass myclass; //… }; これだとMainClassの関数で自由にtest変数を使えるのですがこれは良くない方法なのでしょうか。 自分では、test[][]はメンバー変数で初期化しているつもりでしたが良く考えるとおかしいですね。 この変数はどんな扱いになっているのでしょうか?

その他の回答 (2)

  • KoHal
  • ベストアンサー率60% (110/181)
回答No.3

>引数が違う物をいくつか作成する場合 ご質問の趣旨が分かりにくいです。 MainClass::myclaasの初期化に使う引数ということでしょうか? それなら、1つの手としてはMainClassのコンストラクタにそのための引数を追加する方法がありますが。  MainClass::MainClass( int a, int b ) : myclass( a, b ) {} >array.hについて include指令は、そのファイルの内容を単純に挿入するだけです。 手作業でファイルの内容をコピー&ペーストするのとなんら変わりません。 No.2補足のコードなら、testはMainClassの外で、つまりグローバル変数として定義されてますね。 ヘッダファイル内でグローバル変数を定義するのは避けたほうがよろしいかと思います。 C++だとグローバル変数自体をあまり使いませんし。

lilillii
質問者

お礼

回答、ありがとうございました。 MainClassで使うmyclassの変数が複数あり、それぞれの引数が異なる場合ということです。 myclassがひとつならその方法でできそうです。 クラスにもグローバル変数というのがあったのですね。 知りませんでした。 配列は100×100くらいの大きさなので、プログラムに直に書くのも大変なので、とりあえずはグローバルで扱っていこうと思います。そのうち、リソースにするか別ファイルに記載して読み込むようにしようと思います。 どうもありがとうございました。

  • nitscape
  • ベストアンサー率30% (275/909)
回答No.1

class MainClass { private: MyClass myclass(10,10); public: MainClass() : myclass(10,10) { } }; という感じでコンストラクタから宣言してはどうでしょうか?

lilillii
質問者

お礼

回答ありがとうございました。 他の方の回答で宣言時に初期化はできないことがわかりました。

関連するQ&A

専門家に質問してみよう