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 を宣言します , var2 と var3 、それぞれテンプレート パラメータの 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 = int
、 U = double
および V = char
.
obj2 の場合 、 T = double
、 U = char
および V = bool
.
C言語