お世話になっています。C++なのですが、内部クラスのコンストラクタについてです。
このコードのように、hogeクラス内にhogeHogeクラスを生成し、引数がhogeHogeクラスのメンバ
であるコンストラクタを宣言しました。
気持ち悪いコードではあると思うのですが、
このコード、どこがどうしておかしいのか、スマートに書くとしたらどうしたらいいのか、
また、そもそもhogeHogeクラスのメンバ変数をhogeHogeクラスのコンストラクタの引数にして、
hogeクラスのメンバ変数に代入なんてできないよ、などご指摘いただければ幸いです。
よろしくお願いします。
内部クラスのコンストラクタ定義
Re: 内部クラスのコンストラクタ定義
オフトピック
まず「何をしたいのか」を明確にされたほうがよいのではないでしょうか.
Re: 内部クラスのコンストラクタ定義
hogeHogeクラスのコンストラクタの引数は、たまたま名前がhogeHogeクラスのメンバと被っているだけで、hogeHogeクラスのメンバではありません。SoiSoiMilk さんが書きました:このコードのように、hogeクラス内にhogeHogeクラスを生成し、引数がhogeHogeクラスのメンバ
であるコンストラクタを宣言しました。
hogeHogeクラスのメンバ変数をhogeHogeクラスのコンストラクタの引数にすることなんてできないよ。SoiSoiMilk さんが書きました:また、そもそもhogeHogeクラスのメンバ変数をhogeHogeクラスのコンストラクタの引数にして、
hogeクラスのメンバ変数に代入なんてできないよ、などご指摘いただければ幸いです。
よって、そもそも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;
}
少し書き換えてみました。
class hoge{
public :
int hogeInt;
class hogeHoge{
public :
int hogeHogeInt;
hogeHoge(int hogeHogeInt);
};
};
hoge::hogeHoge::hogeHoge(int hogeHogeInt)
{
hogeInt = hogeHogeInt;
}
int main(){}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
かずま
Re: 内部クラスのコンストラクタ定義
hogeInt は hogeクラスのメンバ関数です。みけCAT さんが書きました:このようなことをするのはinvalidなようですが、なぜでしょうか…?
hogeInt は static ではありません。
したがって、hogeInt にアクセスするには hogeクラスのインスタンスが必要です。
コンストラクタ hogeHoge が呼び出される時、hogeHogeクラスの
インスタンスは存在して、this がそれを指していますが、
hogeクラスのインスタンスはどこにもありません。
だから、エラーです。
-
ISLe()
Re: 内部クラスのコンストラクタ定義
Javaで内部クラスというとインスタンスレベルで結び付く入れ子クラスのことを指しますが
C++の場合、単に名前空間に含まれるだけ、です。
Javaでいうところの静的入れ子クラス(static nested class)です。
Javaなら思った通りになりますよ。
C++の場合、単に名前空間に含まれるだけ、です。
Javaでいうところの静的入れ子クラス(static nested class)です。
Javaなら思った通りになりますよ。
-
SoiSoiMilk
Re: 内部クラスのコンストラクタ定義
皆さん回答ありがとうございます。
やりたいことは、みけCATさんが書いてくださったコード
まさにこの通りですが、かずまさんのご指摘のとおりhogeのインスタンス化がどこにもされていないので
結局エラーになってしまうのですね。
なんだかもどかしいと思ってしまいますが、納得しました!
ありがとうございます。
やりたいことは、みけCATさんが書いてくださったコード
class hoge{
public :
int hogeInt;
class hogeHoge{
public :
int hogeHogeInt;
hogeHoge(int hogeHogeInt);
};
};
hoge::hogeHoge::hogeHoge(int hogeHogeInt)
{
hogeInt = hogeHogeInt;
}
int main(){}
結局エラーになってしまうのですね。
つまりC++ではこのようなことはできないうことですね(>_<)ISLe() さんが書きました:Javaで内部クラスというとインスタンスレベルで結び付く入れ子クラスのことを指しますが
C++の場合、単に名前空間に含まれるだけ、です。
Javaでいうところの静的入れ子クラス(static nested class)です。
Javaなら思った通りになりますよ。
なんだかもどかしいと思ってしまいますが、納得しました!
ありがとうございます。