フレンド関数
http://www.geocities.jp/ky_webid/cpp/language/022.html
前回のフレンドクラスに引き続き、今回はフレンド関数の話です。
考え方は同じです。クラス全体ではなく、関数単位でフレンド化が可能となります。
やってみましょう。
#include <iostream> using namespace std; class CSample { friend int GetNum(CSample& obj); private: int m_num; public: CSample(int num) : m_num(num) {} }; int GetNum(CSample& obj) { // フレンド関係なのでCSampleのprivateなメンバ変数にアクセスできる return obj.m_num; } int main () { CSample obj(200); cout << GetNum(obj) << endl; return 0; }
$ main 200
とこのように関数単位で可能となります。
また、あるクラスの一メンバ関数をフレンド化させることもできます。
#include <iostream> using namespace std; class CSample; class CSample2 { public: int GetNum(CSample& obj); }; class CSample { friend int CSample2::GetNum(CSample& obj); private: int m_num; public: CSample(int num) : m_num(num) {} }; int CSample2::GetNum(CSample& obj) { // フレンド関係なのでCSampleのprivateなメンバ変数にアクセスできる return obj.m_num; } int main () { CSample obj(200); CSample2 obj2; cout << obj2.GetNum(obj) << endl; return 0; }
この宣言順序が大切です。じゃないとコンパイルが通りません。
初めにCSampleの前方宣言し、CSample2の宣言をし、CSampleの宣言をし、最後にCSample2の定義を行わなければなりません。
しかし、フレンドクラスよりも更に使い道がよくわかりませんねこれ。いつ使うんでしょうか。