君はプライベートメンバにアクセスできるフレンズなんだね!
いまだc++を勉強中です。今回はちょっとマイナーな機能、friend
について
friend
friend
を使えば、クラスのプライベートメンバにアクセスできる外部関数を指定できます。
private
を指定すると、基本的に外部からのアクセスは禁止されるのですが、friend
を使えば特例を作ることができる機能です。
この機能を使わなければいけないことは少ないと思いますが、覚えておくと便利かもしれません。
ちなみに、friend
指定はメンバ関数のように行いますが、アクセスが許可されるだけで、関数自体はメンバではありません。
つまりthis
ポインタは渡されませんので、参照やコピーを行ってオブジェクトを関数に渡す必要があります。
もちろん、static
メンバであれば、インスタンスは不要です。
使いみちを考えてみましたが、ポインタでリンクを構築する時とか?
トリッキーなので、一から設計をする際には、あまり選択したくない方法ではありますね
サンプルコードを以下に示します。
#include <iostream> class A; class B; class C; class A{ private: friend bool connectAB( A& a, B& b); //フレンド指定は宣言のように行います B* ptrb = nullptr; }; class B{ private: friend bool connectAB(A& a, B& b); A* ptra = nullptr; }; class C{ private: friend bool connectAB(A& a,B& b); static void foo(){ std::cout << "すごーい!" << std::endl; } }; bool connectAB(A& a,B& b){ //privateにアクセスできます a.ptrb = &b; b.ptra = &a; C::foo(); //staticなら、インスタンスは不要 return true; } int main(){ A a; B b; connectAB(a,b); return 0; //出力: //すごーい! }