内部クラスのコンストラクタ定義

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
SoiSoiMilk

内部クラスのコンストラクタ定義

#1

投稿記事 by SoiSoiMilk » 11年前

お世話になっています。C++なのですが、内部クラスのコンストラクタについてです。
このコードのように、hogeクラス内にhogeHogeクラスを生成し、引数がhogeHogeクラスのメンバ
であるコンストラクタを宣言しました。

気持ち悪いコードではあると思うのですが、
このコード、どこがどうしておかしいのか、スマートに書くとしたらどうしたらいいのか、
また、そもそもhogeHogeクラスのメンバ変数をhogeHogeクラスのコンストラクタの引数にして、
hogeクラスのメンバ変数に代入なんてできないよ、などご指摘いただければ幸いです。
よろしくお願いします。

コード:

class hoge{
public :
	int hogeInt;
	class hogeHoge{
		public :
			int hogeHogeInt;
			hogeHoge(int hogeHogeInt);
	};
	hogeHoge::hogeHoge(int hogeHogeInt)
	{
		hogeInt = hogeHgeInt;
	}	
};

アバター
usao
記事: 1892
登録日時: 12年前
連絡を取る:

Re: 内部クラスのコンストラクタ定義

#2

投稿記事 by usao » 11年前

オフトピック
まず「何をしたいのか」を明確にされたほうがよいのではないでしょうか.

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 内部クラスのコンストラクタ定義

#3

投稿記事 by みけCAT » 11年前

SoiSoiMilk さんが書きました:このコードのように、hogeクラス内にhogeHogeクラスを生成し、引数がhogeHogeクラスのメンバ
であるコンストラクタを宣言しました。
hogeHogeクラスのコンストラクタの引数は、たまたま名前がhogeHogeクラスのメンバと被っているだけで、hogeHogeクラスのメンバではありません。
SoiSoiMilk さんが書きました:また、そもそもhogeHogeクラスのメンバ変数をhogeHogeクラスのコンストラクタの引数にして、
hogeクラスのメンバ変数に代入なんてできないよ、などご指摘いただければ幸いです。
hogeHogeクラスのメンバ変数をhogeHogeクラスのコンストラクタの引数にすることなんてできないよ。
よって、そもそもhogeHogeクラスのメンバ変数をhogeHogeクラスのコンストラクタの引数にして、
hogeクラスのメンバ変数に代入なんてできないよ。

【訂正】以下のように、hogeHogeクラスのメンバ変数をhogeHogeクラスのコンストラクタの引数にすることはできます。

コード:

#include <cstdio>

class hogeHoge {
	public:
		int hogeHogeInt;
		hogeHoge(int a) {
			printf("%d\n", a);
		}
		void hogeHogeFunc() {
			hogeHoge h = hogeHogeInt;
			(void)h; // avoid warning
		}
};

int main(void) {
	hogeHoge h = 346;
	h.hogeHogeInt = 765;
	h.hogeHogeFunc();
	return 0;
}
SoiSoiMilk さんが書きました:

コード:

class hoge{
public :
	int hogeInt;
	class hogeHoge{
		public :
			int hogeHogeInt;
			hogeHoge(int hogeHogeInt);
	};
	hogeHoge::hogeHoge(int hogeHogeInt)
	{
		hogeInt = hogeHgeInt;
	}	
};
少し書き換えてみました。

コード:

class hoge{
public :
    int hogeInt;
    class hogeHoge{
        public :
            int hogeHogeInt;
            hogeHoge(int hogeHogeInt);
    };
};

hoge::hogeHoge::hogeHoge(int hogeHogeInt)
{
    hogeInt = hogeHogeInt;
}

int main(){}
エラーメッセージ(gcc4.8.2)

コード:

prog.cc: In constructor 'hoge::hogeHoge::hogeHoge(int)':
prog.cc:3:9: error: invalid use of non-static data member 'hoge::hogeInt'
    int hogeInt;
        ^
prog.cc:12:9: error: from this location
        hogeInt = hogeHogeInt;
        ^
このようなことをするのはinvalidなようですが、なぜでしょうか…?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 内部クラスのコンストラクタ定義

#4

投稿記事 by かずま » 11年前

みけCAT さんが書きました:このようなことをするのはinvalidなようですが、なぜでしょうか…?
hogeInt は hogeクラスのメンバ関数です。
hogeInt は static ではありません。
したがって、hogeInt にアクセスするには hogeクラスのインスタンスが必要です。

コンストラクタ hogeHoge が呼び出される時、hogeHogeクラスの
インスタンスは存在して、this がそれを指していますが、
hogeクラスのインスタンスはどこにもありません。
だから、エラーです。

かずま

Re: 内部クラスのコンストラクタ定義

#5

投稿記事 by かずま » 11年前

かずま さんが書きました:hogeInt は hogeクラスのメンバ関数です。
訂正。メンバ関数ではなく、メンバ変数です。

ISLe()

Re: 内部クラスのコンストラクタ定義

#6

投稿記事 by ISLe() » 11年前

Javaで内部クラスというとインスタンスレベルで結び付く入れ子クラスのことを指しますが
C++の場合、単に名前空間に含まれるだけ、です。
Javaでいうところの静的入れ子クラス(static nested class)です。

Javaなら思った通りになりますよ。

SoiSoiMilk

Re: 内部クラスのコンストラクタ定義

#7

投稿記事 by SoiSoiMilk » 11年前

皆さん回答ありがとうございます。

やりたいことは、みけCATさんが書いてくださったコード

コード:

class hoge{
public :
    int hogeInt;
    class hogeHoge{
        public :
            int hogeHogeInt;
            hogeHoge(int hogeHogeInt);
    };
};
 
hoge::hogeHoge::hogeHoge(int hogeHogeInt)
{
    hogeInt = hogeHogeInt;
}
 
int main(){}
まさにこの通りですが、かずまさんのご指摘のとおりhogeのインスタンス化がどこにもされていないので
結局エラーになってしまうのですね。
ISLe() さんが書きました:Javaで内部クラスというとインスタンスレベルで結び付く入れ子クラスのことを指しますが
C++の場合、単に名前空間に含まれるだけ、です。
Javaでいうところの静的入れ子クラス(static nested class)です。

Javaなら思った通りになりますよ。
つまりC++ではこのようなことはできないうことですね(>_<)
なんだかもどかしいと思ってしまいますが、納得しました!
ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る