22章 フレンドクラス

http://www.geocities.jp/ky_webid/cpp/language/022.html

なんかまたワケの分からない物が出てきました。

フレンドクラスの指定には、friendキーワードを使うのですが、どちら側のクラスの定義に記述するのかに注意して下さい。「自身のクラスのメンバに自由にアクセスできるのは、このクラスである」という宣言になるので、アクセスされる側に friend宣言が含まれます。なお、friend宣言自体はクラス定義内のどこに書いても構いませんが、多くの場合、定義の先頭部分に記述します。この方が、他のクラスとの関連が分かりやすいからです。

なんだかややこしいですね。

とにかく実装してみましょう。

#include <iostream>
using namespace std;

// クラスの前方宣言
class CSampleFriend;

class CSample {
    // CSampleはCSampleFriendから自由にアクセス可能とする
    friend class CSampleFriend;
private:
    int m_num;
public:
    CSample(int num) : m_num(num) {}
};

class CSampleFriend {
public:
    int GetNum(CSample& obj) {
        // フレンド関係なのでCSampleのprivateなメンバ変数にアクセスできる
        return obj.m_num;
    }
};

int main() {
    CSample       obj(100);
    CSampleFriend friend_obj;
    
    cout << friend_obj.GetNum( obj ) << endl;
    
    return 0;
}
$ main
100

見事にprivateなメンバ変数にアクセス出来ています。

ですが、これって一体何の意味があるんでしょうか?

結局のところ、CSample側で予めCSampleFriendを指定しておかなければならないので何を想定しているのか今一良く分かりません。初めからCSampleに書けば良い気もしますし・・・。

一応ひとつだけ考えたのですが、例えば

class CSample {
#ifdef DEBUG
    friend class CSampleTestCode;
#endif
    // いろいろ
}

上記のようにCSampleTestCodeクラスをフレンド関係にしておいて、CSampleのprivateなメンバ関数等のテストコードを書くとか?

色々謎は尽きないですね。フレンドクラスに関しては今後も使い道等調べていきたいと思います。