ref Object Class

C++/CLI の Maneged Mode で一般的に使われる ref class の紹介です。
Object Class の詳しい説明は、UnManeged Mode の構造体(及び class)を参照して下さい。

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

プログラムの説明

  1. GcmLcm.cpp を CLI.BAT と同じフォルダーに格納して下さい。
    コンパイルと実行の方法は Set UP を参照して下さい。
    C:\Data\Cpp\CLI.BAT
    C:\Data\Cpp\GcmLcm.cpp
    ファイル名 説明
    GcmLcm.cpp ref Object Class
  2. C++/CLI では UnManeged Mode と Maneged Mode が混在して、結構ややこしくなります。
    また Maneged Mode の Object Class には幾つかの種類があります。
    最初に Maneged Mode で一般的に使われる ref class を紹介します。
  3. ref class の Object Class は、キーワード「ref class」で始めます。
    GCM(最大公約数) と LCM(最小公倍数) を求める Object Class を定義してみました。
    中身は Normal Mode の Object Class と同様です。
    UnManeged Mode の簡単な Object Class と比べてみて下さい。
    using namespace System;
    
    ref class GcmLcm
    {
      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;
        }
    
        int lcm(int v1, int v2)
        {
            return v1*v2/gcm(v1,v2);
        }
    };
    
  4. lcm() メソッド(メンバ関数)から gcm() メソッドを呼び出していることに注目して下さい。
    return v1*v2/gcm(v1,v2);
  5. GcmLcm^ gcmlcm; は Object Class の定義で、「^」はポインタ(Win32 Mode では *)を意味します。
    gcnew GcmLcm(); でインスタンス化して下さい。
    UnManeged Mode では new を使っていましたが、C++/CLI の Maneged Mode では gcnew を使います。
    メソッドは gcmlcm->gcm(x,y) のように「->」で参照します。
    C++/CLI では自動的に領域を開放してくれるので delete は必要無いようです。
    int main()
    {
        GcmLcm^ gcmlcm;
        int     x = 32;
        int     y = 24;
    
        gcmlcm = gcnew GcmLcm();
        Console::WriteLine("{0} と {1} の GCM は {2} で、LCM は {3} です",
            x,y,gcmlcm->gcm(x,y),gcmlcm->lcm(x,y));
        delete gcmlcm;
        System::Console::ReadLine();
        return 0;
    }
    

ファイルを分ける

  1. Main() メソッドと Object Class のファイルを分けてみましょう。
    プロジェクトを作成して Console.cpp, GcmLcm.cpp, GcmLcm.h をプロジェクトに加えて下さい。
    今までは省略することが多かったのですが、namespace を使ってみました。
    namespace の説明は namespace 宣言 を参照して下さい。
  2. ファイルを分ける時は、Object Class のヘッダーと関数の定義を別ファイルで作成します。
    Object Class のヘッダーファイル GcmLcm.h では、GcmLcm Class の領域と関数のプロトタイプを定義します。
    /*★ GcmLcm class  Header File    前田 稔 */
    
    namespace GcmLcmLib
    {
        ref class GcmLcm
        {
          private:
            int     w1,w2;
    
          public:
            int gcm(int v1, int v2);
            int lcm(int v1, int v2);
        };
    }
    
  3. 関数の本体は GcmLcm.cpp に記述します。
    先頭で GcmLcm.h を #include して下さい。
    GcmLcm:: はスコープ演算子です。
    スコープ演算子の説明は scope 演算子 を参照して下さい。
    /*★ GcmLcm class  関数定義    前田 稔 */
    #include "GcmLcm.h"
    using namespace System;
    
    namespace GcmLcmLib
    {
        int GcmLcm::gcm(int v1, int v2)
        {
            w1 = v1;
            w2 = v2;
            while(w1 != w2)
            {   if (w1 > w2)    w1-= w2;
                else            w2-= w1;
            }
            return w1;
        }
    
        int GcmLcm::lcm(int v1, int v2)
        {
            return v1*v2/gcm(v1,v2);
        }
    }
    
  4. Main() プログラム Console.cpp は次のようになります。
    [追加][既存項目]からソースファイル(Console.cpp と GcmLcm.cpp)をプロジェクトに加えて下さい。
    今までと同様に「デバッグの開始」でコンパイル&実行が行われます。
    /*★ GcmLcm を参照する Main 関数    前田 稔 */
    
    #include "GcmLcm.h"
    using namespace System;
    using namespace GcmLcmLib;
    
    int main()
    {
        GcmLcm^ gcmlcm;
        int     x = 32;
        int     y = 24;
    
        gcmlcm = gcnew GcmLcm();
        Console::WriteLine("{0} と {1} の GCM は {2} で、LCM は {3} です",
            x,y,gcmlcm->gcm(x,y),gcmlcm->lcm(x,y));
        delete gcmlcm;
        System::Console::ReadLine();
        return 0;
    }
    
  5. コマンド・プロンプトから分割コンパイルする方法です。
    一般的なコマンド・プロンプトからのコンパイルは テストプログラム を参照して下さい。
    1. 次のファイルを、例えば C:\TMP に格納します。
      ・GcmLcm.h
      ・GcmLcm.cpp
      ・Console.cpp
    2. スタートメニューから[すべてのプログラム][Visual C++ 2005 Express Edition][Visual Studio Tools] [Visual Studio 2005 コマンド プロンプト] から起動します。
    3. Console.cpp と GcmLcm.cpp をコンパイルして Console.exe を実行します。
      C:\Users\maeda>CD C:\TMP
      C:\TMP>CL /CLR Console.cpp GcmLcm.cpp
      C:\TMP>Console.exe
    4. Console.cpp と GcmLcm.cpp を分けてコンパイルする方法もあります。
      GcmLcm.obj を作成します。
      C:\TMP>CL /CLR GcmLcm.cpp
    5. GcmLcm を組み込んで Console.exe を作成します。
      C:\TMP>CL /CLR Console.cpp GcmLcm.obj
    6. プログラムを実行します。
      C:\TMP>Console.exe
  6. Object Class のヘッダー定義と関数本体を別ファイルにする方法は良く使われます。
    むしろ同じファイルに記述する方が稀かも知れません。
    Microsoft が提供している Object Class では、ヘッダー定義と関数本体が分かれている方が普通です。
    本格的な Object Class の説明は 超初心者のプログラム入門(C言語 Windows) を参照して下さい。
    別ファイルにするか否かは、inline 関数に関係します。
    inline 関数の説明は inline 関数 を参照して下さい。
  7. C# の場合はヘッダーファイルを使わないのでもっと簡単です。
    gcmlcm Class を定義 を参照して下さい。

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