テンプレートクラス
汎用クラス
前回の汎用関数に続いて、汎用クラスというものもあります
基本的な概念は、前回のテンプレートと変わりません
汎用クラスとは、やはりデータ型に関係なく処理内容が同じクラスに便利です
例えばスタックやキューの管理クラスなどは、代表的な汎用クラスです
スタックは、整数型のスタック管理クラスのアルゴリズムを
そのまま、文字列型でも浮動小数点型でも代用することができます
汎用クラスも template キーワードを用い
ここで宣言した汎用データ型を、メンバとして使用することができます
template <class type> class class-name {
type が、インスタンスシエードの時に用いる汎用データ型です
使い方は汎用関数と同じで、カンマで区切り複数指定することもできます
汎用関数の仕様は通常の関数と変わりませんでしたが
汎用クラスのオブジェクトを生成するには、データ型の定義をしなくてはいけません
class-name <type> obj;
class-name はクラス型の指定です
ここで指定した type は、このクラスで操作するデータ型を指定します
汎用クラスのメンバ関数は、自動的に汎用関数となるので template で明示する必要はありません
#include <iostream>
using namespace std;
template <class X> class stack {
X box[64];
int index;
public:
bool push(X var) {
if (index > 63) return false;
box[index] = var;
index++;
return true;
}
X pop() {
if (index == 0) return NULL;
return box[--index];
}
stack() { index = 0; }
};
int main() {
stack < int > n_obj;
n_obj.push(10);
n_obj.push(100);
cout << n_obj.pop() << '\n';
cout << n_obj.pop() << '\n';
stack < char * > cp_obj;
cp_obj.push("Kitty on your lap\n");
cp_obj.push("Chobits\n");
cout << cp_obj.pop();
cout << cp_obj.pop();
return 0;
}
このプログラムは、簡単なスタックの管理プログラムです
クラス stack は、あらゆるデータ型のスタックを実現します
このクラスは、プライベートメンバで汎用データ型 X の配列を持ちます
このデータ型はオブジェクトを生成した時に決定され、コンパイル時にインスタンスシエードされます
ただし、メンバ関数をクラスの外部で定義する場合、そのつど汎用データ型を宣言し
さらに、クラス名の指定の時にも class-name<type> というように指定します
#include <iostream>
using namespace std;
template <class X> class stack {
X box[64];
int index;
public:
bool push(X var);
X pop();
stack() { index = 0; }
};
template <class X> bool stack<X>::push(X var) {
if (index > 63) return false;
box[index] = var;
index++;
return true;
}
template <class X> X stack<X>::pop() {
if (index == 0) return NULL;
return box[--index];
}
int main() {
stack < int > n_obj;
stack < char * > cp_obj;
n_obj.push(10);
n_obj.push(100);
cout << n_obj.pop() << '\n';
cout << n_obj.pop() << '\n';
cp_obj.push("Kitty on your lap\n");
cp_obj.push("Chobits\n");
cout << cp_obj.pop();
cout << cp_obj.pop();
return 0;
}
このプログラムは、先ほどのプログラムを改良したものです
メンバ関数をクラスの外で定義しているところに注目してください