8

私たちのコミュニティや外部で、ネストされたクラスに関するいくつかの投稿を読みましたが、かなり混乱しています。

私が理解している限り、C++ では、ネストされたクラスは個別の/独立したクラスと何ら変わりはありません。

conecpt をよりよく理解しようとしているときに、簡単なコードを書いたところ、外部クラスから友情を与えられなくても、内部クラスが外部クラスにアクセスできることがわかりました。

例えば:

class Outer {
private : // default access modifier
    int x;
    static int sx;
public:
    class Inner {
    public:
        void changeOuterDataMemberValues(int value) {
            sx = value; // changes the private static data member of Outer.

            Outer out;
            out.x = value; // changes the private data member via object (not via class!)
        }
        void printMyOuterDataMember()  {
            cout << sx; // prints the private data member of Outer.
        }
    };
};


class Lonesome {
    void tryingToChangeDataMemberValue(int value) {
        Outer::sx = value; // cannot change the private static data member of Outer.
    }
};

int Outer::sx;

Outer クラスにネストされている Inner クラスはその (Outer クラス) データ メンバーにアクセスできますが、独立したクラスとしての Lonesome は Outer クラスのデータ メンバーにアクセスできません。

これが重複または愚かな質問である場合は申し訳ありませんが、ネストされたクラスと独立したクラス(内部/外部の関係を持たない2つの異なるクラス)には違いがあることを皆さんに確認したいだけです.

ありがとう、シンジケーター =]

4

3 に答える 3

22

この点で、C++03 と C++11 には違いがあります。したがって、答えは、使用しているコンパイラによって異なります。

C++03 準拠のコンパイラを使用している場合:

ネストされたクラスは、外側のクラスのすべてのメンバーにアクセスできません。

C++11 準拠のコンパイラを使用している場合:

入れ子になったクラスは、囲んでいるクラスのすべてのメンバーにアクセスできます。ネストされたクラスは、クラスの別のメンバーとして扱われます。

C++03 標準 11.8 ネストされたクラス:
§1

入れ子になったクラスのメンバーは、囲んでいるクラスのメンバーへの特別なアクセス権も、囲んでいるクラスにフレンドシップを付与したクラスまたは関数への特別なアクセス権もありません。通常のアクセス規則に従うものとします。

C++11 標準 11.7 ネストされたクラス:

ネストされたクラスはメンバーであるため、他のメンバーと同じアクセス権を持ちます。

于 2013-01-30T15:20:34.507 に答える
3

標準のセクション11.7から:

1 - ネストされたクラスはメンバーであり、他のメンバーと同じアクセス権を持ちます。囲んでいるクラスのメンバーは、ネストされたクラスのメンバーに特別なアクセス権を持っていません [...]

したがって、ネストされた (「内部」) クラスは、事実上、囲んでいるクラスのフレンドです。

于 2013-01-30T15:17:02.507 に答える
2

あなたは自分で質問に答えました:

Outer クラスにネストされている Inner クラスはその (Outer クラス) データ メンバーにアクセスできますが、独立したクラスとしての Lonesome は Outer クラスのデータ メンバーにアクセスできません。

OuterC++ の Java とは逆に、クラスの非静的メンバーにアクセスできないことに注意してください。

Outerクラスからクラスへの参照を与えることはよくあることInnerです。

class Outer {
    private : // default access modifier
    int x;
    static int sx;
public:
    class Inner {
    public:
        Inner( Outer & o ) : m_outer( o ) {}
        void changeOuterDataMemberValues(int value) {
            sx = value; // changes the private static data member of Outer.

            //Outer out;
            //out.x = value; // changes the private data member via object (not via class!)
            m_outer.x = value; // <---------
        }
        void printMyOuterDataMember()  {
            cout << sx; // prints the private data member of Outer.
            cout << m_outer.x;
        }
    private:
        Outer & m_outer;
    };
};
于 2013-01-30T15:29:32.687 に答える