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

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

Patricia Arquette
リリース: 2024-11-27 13:36:13
オリジナル
461 人が閲覧しました

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

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

このコード例では、内部クラス Inner が外部クラス Outer 内で定義されています。 Inner のインスタンスが作成されると、Outer クラスのプライベート メンバー変数 var にアクセスできることが期待されます。ただし、コンパイルすると、内部に var という名前のメンバーが存在しないことを示すエラーが発生します。

内部クラスとメンバー アクセス

C の内部クラスはフレンドとみなされますその外側のクラスの。内部クラスはフレンドとして、プライベート メンバーを含む外部クラスのすべてのメンバーにアクセスできます。したがって、Inner のインスタンスは、Outer のプライベート変数 var にアクセスできる必要があります。

問題と解決策

エラーは、間の接続がないことが原因で発生します。内部のインスタンスと外部のインスタンス。 Java では、内部クラスとその外側のクラスの間に暗黙の親子関係が存在します。ただし、C では、この関係を明示的に定義する必要があります。

問題を解決するには、外部クラスへの参照を内部クラスのコンストラクターに渡す必要があります。これにより、外部クラスのメンバーにアクセスするために必要なコンテキストが内部クラスに提供されます。

次に、親子接続を確立し、内部が外部のプライベート変数 var にアクセスできるようにする方法を示す例を示します。

#include <string>
#include <iostream>

class Outer {
public:
    class Inner {
    public:
        Inner(Outer& x): parent(x) {}  // Pass a reference to the outer class

        void func() {
            std::string a = "myconst1";
            std::cout << parent.var << std::endl;

            if (a == Outer::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();

    return 0;
}
ログイン後にコピー

この改訂されたコードにより、Inner が var にアクセスできるようになります。これは、Inner のコンストラクターが、Inner と、それを作成した アウター インスタンスとの間に親子関係を確立するためです。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート