dポイントプレゼントキャンペーン実施中!

自作クラスMainClassがMyClassというクラスをメンバー変数として持つ場合、宣言時に引数をいくつか持つコンストラクタを呼び出そうとすると構文エラーとなります。

class MyClass
{
public:
MyClass(int, int);
}

class MainClass
{
private:
MyClass myclass(10,10);
}


このような宣言はできないのでしょうか。
引数なしのコンストラクタは呼び出せているようです。

A 回答 (3件)

クラス定義内でメンバの初期化は出来ません。


例外として 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の初期設定リストを省略しても所期の結果が得られます。
しかし、初期値を設定した場合でも初期設定を明示することをお勧めしますが。

この回答への補足

回答ありがとうございます。
納得できました。ということは、引数が違う物をいくつか作成する場合は、宣言以外のところで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[][]はメンバー変数で初期化しているつもりでしたが良く考えるとおかしいですね。
この変数はどんな扱いになっているのでしょうか?

補足日時:2005/03/19 20:13
    • good
    • 0

>引数が違う物をいくつか作成する場合


ご質問の趣旨が分かりにくいです。
MainClass::myclaasの初期化に使う引数ということでしょうか?
それなら、1つの手としてはMainClassのコンストラクタにそのための引数を追加する方法がありますが。

 MainClass::MainClass( int a, int b ) : myclass( a, b ) {}

>array.hについて
include指令は、そのファイルの内容を単純に挿入するだけです。
手作業でファイルの内容をコピー&ペーストするのとなんら変わりません。
No.2補足のコードなら、testはMainClassの外で、つまりグローバル変数として定義されてますね。
ヘッダファイル内でグローバル変数を定義するのは避けたほうがよろしいかと思います。
C++だとグローバル変数自体をあまり使いませんし。
    • good
    • 0
この回答へのお礼

回答、ありがとうございました。
MainClassで使うmyclassの変数が複数あり、それぞれの引数が異なる場合ということです。
myclassがひとつならその方法でできそうです。


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

お礼日時:2005/03/20 04:52

class MainClass


{
private:
MyClass myclass(10,10);

public:
MainClass() : myclass(10,10)
{
}
};

という感じでコンストラクタから宣言してはどうでしょうか?
    • good
    • 1
この回答へのお礼

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

お礼日時:2005/03/20 04:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!