134
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'という名前のメンバーはありません。

4

5 に答える 5

142

内部クラスは、それが定義されているクラスのフレンドです。
あ、はい; タイプのオブジェクトは、タイプのオブジェクトの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();
}
于 2009-01-28T01:33:02.867 に答える
35

内部クラスは外部クラスのすべてのメンバーにアクセスできますが、親クラスのインスタンスへの暗黙的な参照はありません (Java の奇妙な点とは異なります)。したがって、外部クラスへの参照を内部クラスに渡すと、外部クラスのインスタンス内のすべてを参照できます。

于 2009-01-28T01:34:12.723 に答える
6

Outerの一部であるものはすべて、パブリックまたはプライベートを問わず、Outerのすべてのメンバーにアクセスできる必要があります。

編集:コンパイラは正しく、varはInnerのメンバーではありません。ただし、Outerのインスタンスへの参照またはポインターがある場合は、それにアクセスできます。

于 2009-01-28T01:18:41.257 に答える
2

var は内部クラスのメンバーではありません。

var にアクセスするには、外部クラス インスタンスへのポインタまたは参照を使用する必要があります。たとえば、pOuter->var は、内部クラスが外部のフレンドである場合、または var が public である場合、C++ 標準に厳密に従っている場合に機能します。

内部クラスを外部クラスのフレンドとして扱うコンパイラもあれば、そうでないコンパイラもあります。IBM コンパイラについては、次のドキュメントを参照してください。

「ネストされたクラスは、別のクラスのスコープ内で宣言されています。ネストされたクラスの名前は、それを囲むクラスに対してローカルです。明示的なポインタ、参照、またはオブジェクト名を使用しない限り、ネストされたクラスの宣言は、目に見える構造のみを使用できます。囲んでいるクラスおよびグローバル変数からの型名、静的メンバー、および列挙子。

入れ子になったクラスのメンバー関数は、通常のアクセス ルールに従い、それを囲むクラスのメンバーへの特別なアクセス権限はありません。外側のクラスのメンバー関数には、ネストされたクラスのメンバーへの特別なアクセス権はありません。」

于 2012-02-20T15:08:11.153 に答える