そろそろ内部クラスに関して一言言っておくか
というかJavaの内部クラスはすげー、と思います。
何故かと言うと、
親のインスタンスを気にせず扱えるでしょう。
これがまず「すげー」んですよ。
どの言語が凄くないって、
C++だ、コルァ!
C++の内部クラスというのは実際かなり旨みが薄い。
Javaみたいに外部クラスのインスタンスにアクセスするためには、
結局コンストラクタで親の参照を受け取るより他になく、
内部クラスでStateクラスなぞを作ったときに、
Stateから親を触るには親の参照ごしになるのは火を見るよりも明らか。
親のインスタンスを一々受け取らないといけないとは何事か。
とはいえ、
classやstructのメモリレイアウトを考えればそれは当然の事であり、
(暗黙のメンバ変数などvptrで十分だろってこと)
内部クラスにすることで、
外部クラスのprivateなものを内部クラスから扱うことはできる。
ちょっと汚いソースだけど
class Hoge { public: Hoge () :bar_(*this) {} private: class Bar { public: Bar(Hoge& hoge) : hoge_(hoge) {} void func() { hoge_.func(); } Hoge& hoge_; }; Bar bar_; void func(){ cout << "func" << endl; } public: Bar& Bar() { return bar_; } }; int main() { Hoge hoge; hoge.Bar().func(); return 0; }
なんてことができる。
BarはHogeのprivateの中にあり、
委譲によって、Hogeのprivateなメンバ関数であるHoge::funcを呼ぶことができる。
まあ、面倒っていうかデザイン的には美しくない……とか思うけどね。