ref class をパラメータで渡す

C++/CLI の Maneged Mode で ref class をパラメータで渡します。

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

プログラムの説明

  1. Object Class を関数 func() のパラメータとして渡します。
    関数 func() では、受け取った Object Class のメソッドを使って GCM を計算します。
  2. ref class の Object Class は、キーワード「ref class」で始めます。
    GCM(最大公約数) を求める Object Class を定義してみました。
    /*★ ref class  GCM    前田 稔 ★*/
    using namespace System;
    
    ref class GCM
    {
      private:
        int     w1,w2;
    
      public:
        int gcm(int v1, int v2)
        {
            w1 = v1;
            w2 = v2;
            while(w1 != w2)
            {   if (w1 > w2)    w1-= w2;
                else            w2-= w1;
            }
            return w1;
        }
    };
    
  3. class GCM をパラメータとして受け取る func() 関数です。
    Maneged Mode では GCM^ で受け取ります。(Win32 Mode では GCM *)
    受け取った Object Class のメソッドを使って GCM を計算して表示します。
    void func(GCM^ pGcm)
    {
        Console::WriteLine("24 と 32 の GCM は {0} です", pGcm->gcm(24,32));
    }
    
  4. main() 関数です。
    GCM Gcm; で直接 Object Class を定義しています。
    Gcm Class を関数 func() のパラメータとして渡すときは %Gcm で渡します。(Win32 Mode では &Gcm)
    System::Console::ReadLine(); は実行画面を確認するために挿入したコードです。
    必要なければ削除して下さい。
    int main()
    {
        GCM     Gcm;
    
        func(%Gcm);
        System::Console::ReadLine();
        return 0;
    }
    

【演習】

GCM Class を次のように定義してプログラムして下さい。
GCM^ pGcm = nullptr;
gcnew で Class を生成します。
pGcm = gcnew GCM();
gcnew で割り当てた領域は delete で開放します。
そのとき、領域が割り当てられていることを確認して開放する SAFE_DELETE(p) を使うのが常套手段になっています。
#define SAFE_DELETE(p) { if (p) { delete (p); (p) = nullptr; } }
SAFE_DELETE(pGcm);
CLI では new で割り当てた領域の開放を忘れても、ガベージ・コレクタが働いて自動的に開放してくれます。

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