読者です 読者をやめる 読者になる 読者になる

そろそろ内部クラスに関して一言言っておくか

misc

というか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を呼ぶことができる。
まあ、面倒っていうかデザイン的には美しくない……とか思うけどね。