茂加部珈琲店

主にtech関連のメモ置き場です

君はプライベートメンバにアクセスできるフレンズなんだね!

いまだ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;

    //出力:
    //すごーい!
}