ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

フレンド関数その2

引き続き本を読みながら勉強。3ページ。

#include <iostream>
using namespace std;

class TestB;

class TestA {
private:
    int m_value;
public:
    TestA(int num) { m_value = num; }
    friend void func(TestA a, TestB b);
};

class TestB {
private:
    int m_value;
public:
    TestB(int num) { m_value = num; }
    friend void func(TestA a, TestB b);
};

void func(TestA a, TestB b)
{
    cout << a.m_value + b.m_value;
}

int main()
{
    TestA a(123);
    TestB b(456);

    func(a,b);
}

この例ではフレンド関数funcがクラスTestAとTestB両方に定義されている。今までこういった書き方を見たことがないのでちょっと新鮮な感じ。
でもフレンド関数でどういったところで使うと効果的なのかいまいちわからない。
メンバ変数へのアクセス関数を用意してそれ経由で処理するよりは軽いのだろうけど、それではせっかくのカプセル化の効果が薄れてしまうような。privateへ簡単にアクセスできてしまうということだから。でもすべてが見えてしまうわけではなくフレンド関数だけだから、それに注意すれば問題はないのか。二つのクラスが相互に動作するような場合にはフレンド関数がないと面倒そうだ。