工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C++ クラス テンプレート

C++ クラス テンプレート

このチュートリアルでは、例を使用して C++ のクラス テンプレートについて学習します。

テンプレートは、C++ の強力な機能であり、一般的なプログラムを作成することができます。テンプレートを実装するには 2 つの方法があります:

関数テンプレートと同様に、クラス テンプレートを使用して、さまざまなデータ型を操作する単一のクラスを作成できます。

クラス テンプレートは、コードを短くして管理しやすくすることができるので便利です。


クラス テンプレートの宣言

クラス テンプレートはキーワード template で始まります <> 内のテンプレート パラメータが続く その後にクラス宣言が続きます。

template <class T>
class className {
  private:
    T var;
    ... .. ...
  public:
    T functionName(T arg);
    ... .. ...
};

上記の宣言では、 T 使用されるデータ型のプレースホルダーであるテンプレート引数であり、 class はキーワードです。

クラス本体内にメンバー変数 var メンバー関数 functionName() 両方ともタイプ T です .


クラス テンプレート オブジェクトの作成

クラス テンプレートを宣言して定義したら、そのオブジェクトを他のクラスまたは関数 (main() など) で作成できます。 関数) を次の構文で使用します

className<dataType> classObject;

たとえば、

className<int> classObject;
className<float> classObject;
className<string> classObject;

例 1:C++ クラス テンプレート

// C++ program to demonstrate the use of class templates

#include <iostream>
using namespace std;

// Class template
template <class T>
class Number {
   private:
    // Variable of type T
    T num;

   public:
    Number(T n) : num(n) {}   // constructor

    T getNum() {
        return num;
    }
};

int main() {

    // create object with int type
    Number<int> numberInt(7);

    // create object with double type
    Number<double> numberDouble(7.7);

    cout << "int Number = " << numberInt.getNum() << endl;
    cout << "double Number = " << numberDouble.getNum() << endl;

    return 0;
}

出力

int Number = 7
double Number = 7.7

このプログラムでは。クラステンプレート Number を作成しました コード付き

template <class T>
class Number {
   private:
    T num;

   public:
    Number(T n) : num(n) {}
    T getNum() { return num; }
};

変数 num 、コンストラクタ引数 n 、および関数 getNum() タイプは T です 、または戻り型 T を持つ .つまり、それらはどのタイプでもかまいません。

main() で 、オブジェクトを作成してクラス テンプレートを実装しました

Number<int> numberInt(7);
Number<double> numberDouble(7.7);

コード Number<int> に注意してください と Number<double> 上記のコードで。

これにより、それぞれ int のクラス定義が作成されます と float 、その後適宜使用されます。

クラス テンプレートのオブジェクトを宣言するときは、型を指定する必要があります。そうしないと、コンパイラはエラーを生成します。

//Error
Number numberInt(7);
Number numberDouble(7.7);

クラス テンプレート外でのクラス メンバーの定義

クラス テンプレートの外で関数を定義する必要があるとします。次のコードでこれを行うことができます:

template <class T>
class ClassName {
    ... .. ...
    // Function prototype
    returnType functionName();
};

// Function definition
template <class T>
returnType ClassName<T>::functionName() {
    // code
}

コード template <class T> に注意してください クラスの外で関数を定義している間、繰り返されます。これは必須であり、構文の一部です。

例 1 のコードを見ると、 、関数 getNum() があります クラス テンプレート Number 内で定義されている .

getNum() を定義できます Number の外側 次のコードを使用:

template <class T>
class Number {
    ... .. ...
    // Function prototype
    T getnum();
};

// Function definition
template <class T>
T Number<T>::getNum() {
    return num;
}

例 2:クラス テンプレートを使用した単純な電卓

このプログラムは、クラス テンプレートを使用して、2 つの変数 num1 の加算、減算、乗算、および除算を実行します。 そして num2 .

int しか使用していませんが、変数は任意の型にすることができます。 と float

#include <iostream>
using namespace std;

template <class T>
class Calculator {
   private:
    T num1, num2;

   public:
    Calculator(T n1, T n2) {
        num1 = n1;
        num2 = n2;
    }

    void displayResult() {
        cout << "Numbers: " << num1 << " and " << num2 << "." << endl;
        cout << num1 << " + " << num2 << " = " << add() << endl;
        cout << num1 << " - " << num2 << " = " << subtract() << endl;
        cout << num1 << " * " << num2 << " = " << multiply() << endl;
        cout << num1 << " / " << num2 << " = " << divide() << endl;
    }

    T add() { return num1 + num2; }
    T subtract() { return num1 - num2; }
    T multiply() { return num1 * num2; }
    T divide() { return num1 / num2; }
};

int main() {
    Calculator<int> intCalc(2, 1);
    Calculator<float> floatCalc(2.4, 1.2);

    cout << "Int results:" << endl;
    intCalc.displayResult();

    cout << endl
         << "Float results:" << endl;
    floatCalc.displayResult();

    return 0;
}

出力

Int results:
Numbers: 2 and 1.
2 + 1 = 3
2 - 1 = 1
2 * 1 = 2
2 / 1 = 2

Float results:
Numbers: 2.4 and 1.2.
2.4 + 1.2 = 3.6
2.4 - 1.2 = 1.2
2.4 * 1.2 = 2.88
2.4 / 1.2 = 2

上記のプログラムでは、クラス テンプレート Calculator を宣言しました。 .

クラスには T 型のプライベート メンバーが 2 つ含まれています。 :num1 &num2 、およびメンバーを初期化するコンストラクター。

add() もあります 、 subtract()multiply() 、および divide() 戻り型 T を持つ関数 . void もあります 関数 displayResult() 他の関数の結果を出力します。

main() で 、 Calculator のオブジェクトを 2 つ作成しました :int に 1 つ データ型と float 用の別の型 データ型。

Calculator<int> intCalc(2, 1);
Calculator<float> floatCalc(2.4, 1.2);

これにより、コンパイラは、コンパイル中にそれぞれのデータ型に対して 2 つのクラス定義を作成するように求められます。


複数のパラメータを持つ C++ クラス テンプレート

C++ では、複数のテンプレート パラメーターを使用でき、それらのパラメーターにデフォルトの引数を使用することもできます。たとえば、

template <class T, class U, class V = int>
class ClassName {
  private:
    T member1;
    U member2;
    V member3;
    ... .. ...
  public:
    ... .. ...
};

例 3:複数のパラメータを持つ C++ テンプレート

#include <iostream>
using namespace std;

// Class template with multiple and default parameters
template <class T, class U, class V = char>
class ClassTemplate {
   private:
    T var1;
    U var2;
    V var3;

   public:
    ClassTemplate(T v1, U v2, V v3) : var1(v1), var2(v2), var3(v3) {}  // constructor

    void printVar() {
        cout << "var1 = " << var1 << endl;
        cout << "var2 = " << var2 << endl;
        cout << "var3 = " << var3 << endl;
    }
};

int main() {
    // create object with int, double and char types
    ClassTemplate<int, double> obj1(7, 7.7, 'c');
    cout << "obj1 values: " << endl;
    obj1.printVar();

    // create object with int, double and bool types
    ClassTemplate<double, char, bool> obj2(8.8, 'a', false);
    cout << "\nobj2 values: " << endl;
    obj2.printVar();

    return 0;
}

出力

obj1 values: 
var1 = 7
var2 = 7.7
var3 = c

obj2 values: 
var1 = 8.8
var2 = a
var3 = 0

このプログラムでは、ClassTemplate という名前のクラス テンプレートを作成しました。 、3 つのパラメーターがあり、そのうちの 1 つがデフォルトのパラメーターです。

template <class T, class U, class V = char>
class ClassTemplate {
  // code  
};

コード class V = char に注意してください .つまり、V デフォルトの型が char のデフォルト パラメータです。 .

ClassTemplate 内 、3 つの変数 var1 を宣言します , var2var3 、それぞれテンプレート パラメータの 1 つに対応します。

class ClassTemplate {
   private:
    T var1;
    U var2;
    V var3;
    ... .. ...
    ... .. ...
};

main() で 、 ClassTemplate のオブジェクトを 2 つ作成します コード付き

// create object with int, double and char types
ClassTemplate<int, double> obj1(7, 7.7, 'c');

// create object with double, char and bool types
ClassTemplate<double, char, bool> obj2(8, 8.8, false);

ここで、

オブジェクト T U V
obj1 int double char
obj2 double char bool

obj1 の場合 、 T = intU = double および V = char .

obj2 の場合 、 T = doubleU = char および V = bool .


C言語

  1. C# 静的キーワード
  2. C# ネストされたクラス
  3. C++ 演算子
  4. C++ コメント
  5. C++ のストレージ クラス
  6. C++ のポリモーフィズム
  7. C++ でのデータの抽象化
  8. C++ でのデータのカプセル化
  9. C++ のインターフェイス (抽象クラス)
  10. C++ テンプレート
  11. C# - 継承