トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
C++
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\n
[ トップページ ]
[ ____CommandPrompt ] [ ____JScript ] [ ____MySQL ] [ ____Cygwin ] [ ____Java ] [ ____Emacs ] [ ____Make ] [ ____Perl ] [ ____Python ] [ ____OpenGL ] [ ____C# ] [ ____StyleSheet ] [ ____C++ ] [ ____Winsock ] [ ____Thread ] [ ____VisualStudio ] [ ____C ] [ ____Win32API ] [ ____Lua ] [ ____PhotoShop ]
ヘッダ検索

___

■ friend(フレンド)


    フレンドには3種類ある
     フレンド関数
     フレンドメンバ関数
     フレンドクラス
フレンドは次の場合につかう
     2つ以上のクラスが連携してうごき、互いの実装にアクセスをするとき
     実際は1つのクラスだが 寿命やインスタンスの数が違うときにつかう

    

___

■ フレンド関数

フレンド関数とはクラスの public 以外のメンバにアクセスできる 非メンバ関数のこと。 friend 関数を宣言するアクセスレベルはどこでもいい。 コンパイラはアクセスレベルの指定は考慮していない。

    // 以下のどれでも同じ。
    class Vector {
      public:
        friend  ostream &operator < <  ( ostream &o, const Vector v );
      protected:
        friend  ostream &operator < <  ( ostream &o, const Vector v );
      private:
        friend  ostream &operator < <  ( ostream &o, const Vector v );
    };

___

■ フレンド関数のつかいどころ

本質的にはメンバ関数とかわらない。( メンバ関数は public 以外にアクセスできるから ) フレンド関数にするには、利用者側のコードが直感的になるようになるときに使う。 そのため本来、メンバ関数であるべきものを、フレンド関数にするといい。
     演算子の右辺にくる場合
     
    class Vector {
    public:
      friend  ostream &operator < <  ( ostream &o, const Vector v );
    };


    ostream &operator < <  ( ostream &o, const Vector v ) {
      return o < <  v.x < <  " " < <   v.y < <  " " < <   v.z < <  endl;
    }

    {
      Vector v;
      cout < <  v < <  endl;
    }

___

■ フレンド関数を仮想関数にする

フレンド関数は仮想関数にできないので、フレンド関数側で、仮想関数をよびだすことで実現する。
    class Gui {

      public:

        friend ostream & operator< <  ( ostream &o, const Gui &gui );
      protected:
        // 実体
        virtual void print( ostream &o ) const = 0;
    };

    ostream & operator< <  ( ostream &o, const Gui &gui ) {
      gui.print();
    }

    class Button : public Gui {

      protected:
        virtual void print( ostream &o ) const {}
    };
___

■ フレンドクラス

あるクラスが別のクラスに private アクセスを許す場合は次のようにかく
    // Base クラスは T からのアクセスを許可する
    class B  ase {
      frie nd T;
    };    

                       
派生クラスは friend 関係を "継承しない"。 ( 許可すると派生してしまえばすべてアクセスできることになるから )
    class Derive : public Base {

    };
___

■ フレンドクラスのつかいどころ

クラスの特徴をユーザーからは隠したいが、特定の関連クラスにだけ公開したい場合に使う。 プライベートクラスとして使える。 プライベートクラスは実装のためだけに使うクラス。 これを使うと、名前の重複を防ぐことができる。
    class LinkList {

      // クラス Node は LinkList 固有のため内部のスコープにしてプライベートにしてしまう。
      class Node {

        friend  Node;

        
      };
    }



NINJAIDX 12