内部クラスはプライベート変数にアクセスできますか? 質問する

内部クラスはプライベート変数にアクセスできますか? 質問する
class Outer {

    class Inner {
    public:
        Inner() {}
        void func() ;
    };

private:
    static const char* const MYCONST;
    int var;
};

void Outer::Inner::func() {
    var = 1;
}

const char* const Outer::MYCONST = "myconst";

Outer::Innerクラスに`var'という名前のメンバーがないのでコンパイルすると、このエラーが発生します。

ベストアンサー1

内部クラスは、その中で定義されているクラスのフレンドです。
つまり、 型のオブジェクトは型のオブジェクトのOuter::Innerメンバー変数にアクセスできます。varOuter

ただし、Java とは異なり、型のオブジェクトOuter::Innerと親クラスのオブジェクトの間には相関関係はありません。親子関係を手動で作成する必要があります。

#include <string>
#include <iostream>

class Outer
{
    class Inner
    {
        public:
            Inner(Outer& x): parent(x) {}
            void func()
            {
                std::string a = "myconst1";
                std::cout << parent.var << std::endl;

                if (a == MYCONST)
                {   std::cout << "string same" << std::endl;
                }
                else
                {   std::cout << "string not same" << std::endl;
                }
            }
        private:
            Outer&  parent;
    };

    public:
        Outer()
            :i(*this)
            ,var(4)
        {}
        Outer(Outer& other)
            :i(other)
            ,var(22)
        {}
        void func()
        {
            i.func();
        }
    private:
        static const char* const MYCONST;
        Inner i;
        int var;
};

const char* const Outer::MYCONST = "myconst";

int main()
{

    Outer           o1;
    Outer           o2(o1);
    o1.func();
    o2.func();
}

おすすめ記事