Friends としてクラス メンバー関数とクラス
クラスのメンバー関数を他のクラスのフレンドとして宣言できます。次に例を示します。
// classes_as_friends1.cpp
// compile with: /c
class B;
class A {
public:
int Func1( B& b );
private:
int Func2( B& b );
};
class B {
private:
int _b;
// A::Func1 is a friend function to class B
// so A::Func1 has access to all members of B
friend int A::Func1( B& );
};
int A::Func1( B& b ) { return b._b; } // OK
int A::Func2( B& b ) { return b._b; } // C2248
前の例では関数のみ A::Func1(B&)B を分類するフレンド アクセスを許可されます。したがってプライベート メンバー _b にアクセスするにはクラス A の Func1 でのみ Func2 に対応します。
friend のクラス メンバー関数は他のクラスのプライベート メンバーとプロテクト メンバーにアクセスできるメンバー関数を持つクラスではフレンド関数つまりすべてのクラスです。クラス B の friend の宣言が次のとおりであるとします。:
friend class A;
その場合クラス A のすべてのメンバー関数は B を分類するフレンド アクセスを許可します。次のコードはフレンド クラスの例です :
// classes_as_friends2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class YourClass {
friend class YourOtherClass; // Declare a friend class
public:
YourClass() : topSecret(0){}
void printMember() { cout << topSecret << endl; }
private:
int topSecret;
};
class YourOtherClass {
public:
void change( YourClass& yc, int x ){yc.topSecret = x;}
};
int main() {
YourClass yc1;
YourOtherClass yoc1;
yc1.printMember();
yoc1.change( yc1, 5 );
yc1.printMember();
}
フレンドシップを明示的に指定されてそれ自体ではありません。上の例ではYourClass のメンバー関数は YourOtherClass のプライベート メンバーにアクセスできません。
マネージ型はフレンド関数フレンド クラスフレンド インターフェイスを含めることはできません。
YourOtherClass から派生したクラスは entity_YourClass のプライベート メンバーにアクセスできないことを意味するフレンドシップは継承されません。フレンドシップは中間はYourOtherClass のフレンド entity_YourClass のプライベート メンバーにアクセスできないとなるクラスではありません。
次の図は4 種類のクラス宣言を示しています : BaseDerivedaFriend と anotherFriend。クラスは aFriendBase のプライベート メンバーに直接アクセスし(すべてのメンバーに Base を継承する場合があります)。
フレンド関係の影響