UnManeged Mode Class

UnManeged Mode の簡単な Object Class を定義します。

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

プログラムの説明

  1. C++/CLI では UnManeged Mode と Maneged Mode が混在して、結構ややこしくなります。
    そこで最初に UnManeged Mode の簡単な Object Class を定義してみましょう。
    class GcmLcm は最大公約数(GCM)と最小公倍数(LCM)を求める Object Class です。
    最大公約数(GCM)と最小公倍数(LCM)の説明は Gcm Lcm の説明 を参照して下さい。
  2. w1,w2 は Class 内で使う作業領域で private: で宣言しています。
    Object Class では省略すると private になるので private: は省略することが出来ます。
    最初のプログラムでは Class の宣言と同時に GcmLcm class の実体を定義しています。
    この場合は new 演算子で class を生成する必要はありません。
    メンバ関数を呼び出すときは gcmlcm.gcm(x,y) のように「.」を付けて参照します。
    class GcmLcm
    {
      private:
        int     w1,w2;
      public:
          :
          :
    } gcmlcm;
    
  3. ソースコードが短いので gcm() や lcm() を inline 関数として定義してみました。
    class GcmLcm {...} の中で関数を実装すると inline 関数になります。
    inline 関数の説明は inline 関数 を参照して下さい。
    lcm() メソッド(メンバ関数)から gcm() メソッドを読んでいることに注目して下さい。
    /*★ Normal class  GCM/LCM    前田 稔 ★*/
    #include <stdio.h>
    
    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);
        }
    } gcmlcm;
    
    int main()
    {
        int     x = 32;
        int     y = 24;
    
        printf("%d と %d の GCM は %d で、LCM は %d です",
                x,y,gcmlcm.gcm(x,y),gcmlcm.lcm(x,y));
        return 0;
    }
    
  4. 次は GcmLcm Object Class を new で生成します。
    GcmLcm *gcmlcm; でポインタを定義して、new GcmLcm(); でインスタンスを生成します。
    メンバ関数を呼び出すときは gcmlcm->gcm(x,y) のように「->」を付けて参照します。
    使い終わったインスタンスは delete で削除して下さい。
        GcmLcm  *gcmlcm;
    
        gcmlcm = new GcmLcm();
    
    /*★ Normal class  GCM/LCM    前田 稔 ★*/
    #include <stdio.h>
    
    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);
        }
    };
    
    int main()
    {
        int     x = 32;
        int     y = 24;
        GcmLcm  *gcmlcm;
    
        gcmlcm = new GcmLcm();
        printf("%d と %d の GCM は %d で、LCM は %d です",
                x,y,gcmlcm->gcm(x,y),gcmlcm->lcm(x,y));
        delete gcmlcm;
        return 0;
    }
    
  5. 次のように定義すると gcmlcm の名前でメモリ上に領域が確保されます。
    class GcmLcm
    {
        ・・・・
    } gcmlcm;
    
    ところが、次のように書くと class GcmLcm の型の定義だけで、領域(実態)はありません。
    new でインスタンス化(領域を確保)してから参照して下さい。
    class GcmLcm
    {
        ・・・・
    };
    
  6. Object Class の基本は 構造体で private を使う を参照して下さい。
    C#でも同様のプログラムを作成しています。

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