9

私は外部クラスを持っていAます。方法がありA::funます。このメソッドには、ローカルまたは内部クラスがありBます。私の質問は:Bの友達Aですか?

そうではないと思います。そうですか?もしそうなら、 let class Ba friend はの private と protected メンバーにアクセスできるAので、非常に有益だと思います。さらに、はメソッド内でローカルであるため、他のユーザーからはアクセスできないため、 のフレンドとして安全です。のプライベートおよび保護されたメンバーにアクセスできるようにするにはどうすればよいですか?BABABA

4

3 に答える 3

14

いいえ、彼らは友達ではありません。

ただし、ローカル クラスは、関数自体と同じように関数外の名前にアクセスできます。

標準は次のように述べています。

9.8 ローカルクラス宣言 [class.local]

クラスは関数定義内で宣言できます。このようなクラスは、ローカル クラスと呼ばれます。ローカル クラスの名前は、それを囲むスコープに対してローカルです。ローカル クラスは外側のスコープのスコープ内にあり、外側の関数と同じように、関数の外部の名前にアクセスできます。ローカル クラスの宣言は、外側のスコープからの自動ストレージ期間を持つ変数を ODR 使用 (3.2) してはなりません。

カウントする大きな違いは、ローカル クラスは関数内でしかアクセスできないことです。

しかしその後:

  • クラスのフレンドは、クラスのプライベートおよび保護されたメンバー名を使用する権限が与えられた関数またはクラスです。
  • ローカル クラスは外側のスコープのスコープ内にあり、外側の関数と同じように、関数の外部の名前にアクセスできます。つまり、関数が属するクラスの保護されたプライベート メンバーにアクセスできます。
于 2013-08-28T15:00:09.850 に答える
6

いいえ、彼らは友達ではありません。しかし、それは問題ですか?
あまり!次の事実を考慮してください。

  1. メンバー関数内では、関数が属するクラスのメンバーに常にアクセスできます。
  2. 関数を超えてローカル クラスにアクセスすることはできません。

したがって、彼らが友達であるかどうかはほとんど問題ではありません。メンバー関数内の外部クラス メンバーを常に参照することになります。

オンライン サンプル:

class A
{
    int i;
    void doSomething()
    {
        class B{public: int ii;};
        B obj;
        obj.ii = i;
    }
};

int main()
{
    return 0;
}
于 2013-08-28T14:57:42.017 に答える
3

これは Clang でコンパイルされます。

class A {
  typedef int Int;
  void fn();
};

void A::fn() {
  class B {
    Int i;
  };
}

内部クラスは A のプライベート メンバーにアクセスできますが、それは友人であるからではなく、メンバーと見なされるためです。クラスのメンバーはプライベート メンバーにアクセスできるため、これには内部クラスとメンバー関数のローカル クラスが含まれます。

[class.access]p2 を参照してください。

于 2013-08-28T14:58:40.380 に答える