2013年11月4日月曜日

C++ フレンド

クラスのメンバをprivateにすると、当然他のクラスからアクセスできなくなります。
しかし、別の特定のクラスからほんのちょっとだけ特別にアクセスしたくなることが
あるかと思います。(^_^;)

そんな時に便利なのが、フレンドクラスの機能です。
たとえば、次のようにするとTheOtherInfoクラスは、OneInfoクラスのフレンドクラスと
なります。

//TheOtherInfoクラスをOneInfoクラスのフレンドクラスに宣言します^^
class OneInfo {
friend class TheOtherInfo;
private:
    int some_info;
};

こうすると、なんとTheOtherInfoクラスからOneInfoクラスのpriveteメンバに
アクセスできてしまうのです!

class TheOtherInfo {
public:
    void Accessor(OneInfo anyInfo) {
        //OneInfoクラスのprivateメンバにアクセス可!!
        anyInfo.some_info = 1;
    }
};

フレンドクラスの宣言は、クラス定義の中のどこに書いてもOKです。^^
また、今回の例では、TheOtherInfoクラスはOneInfoクラスのフレンドクラスとなります。
しかし、OneInfoクラスはTheOtherInfoクラスのフレンドクラスではありません。
悲しきかな、フレンドの関係は片方向だけになります。(>_<) そ、そんな...

また、以下のように特定の関数だけをフレンドの関係にすることもできます。

//クラス外にある通常の関数GlobalAccessor()をフレンドにします。
class OneInfo {
    friend void GlobalAccessor(OneInfo anyInfo);
        :

実はこのようにフレンドクラスやフレンド関数を使うと、privateで設定したアクセス制限が
破られてしまうので、後のプログラム修正が煩雑になってしまうというデメリットがあります。

フレンドクラスやフレンド関数の使用には十分に注意してください^^;

今日の名言
悩み事は次の三段階の解決策によって克服することだ。
  1. まず最悪の事態を考えてみる。
  2. どうしても避けられないと分かったら、あっさり覚悟を決める。
  3. ついで、気を落ち着けて、事態の改善に取りかかる。
                                   デール・カーネギー

人生は砂時計のようなものだ。砂時計の二つの瓶はごく細い首で繋がっていて、一度に
砂粒一つしか通り抜けられない。
これが人生の真の姿である。たとえ多忙きわまる日でも、仕事のいっぱい詰まった時間は、
一度にわずかずつ姿を現わす。人生はすべてこの通りである。たとえ一日中に取り組む仕事
問題、心の緊張はおびただしくても皆、必ず一度に一つずつやってくる。
                                ジェイムズ・ゴードン・ギルギー

忙しい状態に身を置くという単純なことで、なぜ不安を拭い去ることができるのだろうか?
そのわけは、ある法則 - 心理学が明らかにした最も基本的な法則のためである。
その法則とは、どんなに優秀な頭脳の持ち主であっても、人間は一度に「一つのこと」しか
思考できないというものだ。
                                       デール・カーネギー