Friend

friend.png
  • global変数を使わない(メンバ変数にする)
  • メンバ変数をpublicにしない

を避ける目的でfriendを使うらしい。
違う型(class)同士の演算を定義したい場合に使う。
たとえばmatrixvec3を掛け算したい、などという場合に使用する。
Effective C++第19項によれば、friendはなるべく使わない方がいい。
では、friendはいつ使うべき?

friendを使うべき時

publicではないクラスメンバにアクセスする必要のある非メンバ関数

operator>>のオーバーロードする時に、このような状況に陥る。
つまり、ユーザ定義型をどうしてーーーも右オペランドにしたいとき、ってことだ。

friend関数の作り方

friend修飾子を付けて.hで宣言する

class CMiffy{
friend void MyFriendFunc(CMiffy& _me);
}

この時、フレンド関数の引数には自分自身のクラス名が入っている場合が多い(ていうか絶対そう?)

.cppでfriend修飾子なし&クラス名::なしで定義する

void MyFriendFunc(CMiffy& _me){}

テンプレートクラスのfriend関数

を普通にやると未解決の外部参照になってしまうのだ。
templateクラスでoperator<<をオーバーロード

friend std::ostream& operator«(std::ostream& _s,const vec3<T>& _in);

と書くと、未解決の外部参照になってしまう。
今のところの妥協策はヘッダに書いてしまうこと

        friend ostream& operator<<<>(std::ostream& _s,const vec3<T>& _in);
        {
            _s<<_in.x<<","<<_in.y<<","<<_in.z;
            return _s;
        }

これって駄目だよね??

関連エラー

c2255friendはメンバ変数として宣言しなければならない。
c2433friendはデータの宣言には使用できません。

サポートサイト Wikidot.com