C++: ネストされた InnerClass は OuterClass の private にアクセスできる

2011 年 3 月 20 日 はてなブックマークへ追加 はてなブックマーク - C++: ネストされた InnerClass は OuterClass の private にアクセスできる Bookmark this on Delicious

クラスのネストは単に名前空間みたいな物だと思っていたけど、大きな間違いだった。

以下のコードは正しい。少なくとも C++0x では:

class Outer
{
private:
    class State
    {
        // 略
    public:
        virtual void action(Outer &ctx) = 0;
    };

    class BarState;  // 略

    class FooState : public State
    {
    public:
        virtual void action(Outer &ctx)
        { ctx.changeState(GetInstance<BarState>()); }
    };

    // Outer::State::action() は private な Outer::changeState()
    // にアクセスできる
    void changeState(const State &newstate);  // 略
};

C++ Standard Core Language Defect Reports によると、

"have no special access" のくだりを読む限り、ネストされた内側クラス State は外側 Outerprivate メンバーへアクセスできなさそうなのだが、 内側クラス State が外側クラスのメンバーだと考えると話は違ってくる。

Defect Reports ではこの点が明記された:

A nested class is a member and as such has the same access rights as any other member.

ネストされたクラスのご利用は計画的に。

コメント

blog comments powered by Disqus