Friend 関数を使う

C++/CLI で Friend 関数で private 領域にアクセスします。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. private 領域は Class の外からのアクセスを禁止するものですが、Friend 関数で定義するとアクセスが許されます。
    class Cls1 と class Cls2 で定義されている val の領域は private で宣言されています。
    本来なら val へのアクセスは Class 内に限るのですが friend で宣言されている Disp() 関数からはアクセスすることが出来ます。
    次の宣言に注目して下さい。
    friend void Disp(Cls1 *p1, Cls2 *p2);
    Disp() はパラメータとして Cls1 と Cls2 のポインタを受け取ります。
    Cls2 は Cls1 に続いて宣言されているのですが、この時点では Cls2 はコンパイラに認識されていないためにエラーになってしまいます。
    そこで Cls2 は class であることを前方参照でコンパイラに知らせます。
    class Cls2;
    Disp() 関数は Class Cls2 の中でも宣言されていて、二個の Class に共通の関数となります。
    /*★ Friend 関数    前田 稔 ★*/
    #include <iostream>
    using namespace std;
    
    //前方参照
    class  Cls2;
    
    class  Cls1
    {
      private:
        int     val;
        friend void Disp(Cls1 *p1, Cls2 *p2);
      public:
        Cls1(int v)
        {
            val= v;
        }
    };
    
    class  Cls2
    {
      private:
        int     val;
        friend void Disp(Cls1 *p1, Cls2 *p2);
      public:
        Cls2(int v)
        {
            val= v;
        }
    };
    
  2. フレンドリ関数 Disp() を見てみましょう。
    Disp() はパラメータとして Cls1 と Cls2 のポインタを受け取る普通の関数です。
    クラスのポインタを通じて private 領域の val の値を印字しています。
    void  Disp(Cls1 *p1, Cls2 *p2)
    {
        cout << "Cls1.val=" << p1->val << "  Cls2.val=" << p2->val << "\n";
    }
    
  3. main() 関数です。
    int main()
    {
        Cls1    cs1(123);
        Cls2    cs2(456);
        Disp(&cs1,&cs2);
        return 0;
    }
    

超初心者のプログラム入門(C/C++)