ホームページ >バックエンド開発 >C++ >C の内部クラスは、どのようにして外側のクラスのプライベート メンバーにアクセスできますか?

C の内部クラスは、どのようにして外側のクラスのプライベート メンバーにアクセスできますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-08 06:51:14243ブラウズ

How Can Inner Classes in C   Access Private Members of Their Enclosing Class?

C のプライベート変数にアクセスする内部クラス

C では、内部クラスには、外側のクラスのプライベート メンバーにアクセスする独自の機能があります。次の例を考えてみましょう。

class Outer {

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

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

この例では、内部クラスが外部クラス内で定義されています。従来のスコープ規則によれば、Outer の var メンバー変数は Inner からアクセスできないようにする必要があります。ただし、C では、内部クラスは本質的に、それを囲んでいるクラスのフレンドです。

その結果、Outer::Inner 型のオブジェクトは、Outer のプライベート メンバー変数にアクセスできます。ただし、このアクセスは内部クラスのスコープ内でのみ許可されることに注意することが重要です。

この概念をさらに説明するために、内部クラスの func() メソッドを次のように変更してみましょう。

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

ここで、このコードをコンパイルしようとすると、「class external::Inner」に「var」という名前のメンバーが存在しないことを示すエラー メッセージが表示されます。これは、内部クラスがプライベート メンバーにアクセスできる一方で、外側のクラスとのメンバー関係を継承しないためです。

内部クラス内で適切なメンバー関係を確立するには、次の例に示すように、囲んでいるクラス:

class Outer
{
    class Inner
    {
        public:
            Inner(Outer& x): parent(x) {}
            void func()
            {
                std::cout << parent.var << std::endl;
            }
        private:
            Outer& parent;
    };

    public:
        Outer() : i(*this), var(4) {}
        void func()
        {
            i.func();
        }
    private:
        Inner i;
        int var;
};

int main()
{
    Outer o;
    o.func();
}

この例では、内部クラスのコンストラクターは外部クラスへの参照を引数として受け取ります。これにより、Outer::Inner 型のオブジェクトが親参照を介して、Outer のプライベート メンバーにアクセスできるようになります。

以上がC の内部クラスは、どのようにして外側のクラスのプライベート メンバーにアクセスできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。