C++入門 補足3
クラスのテンプレート
クラスのテンプレートについて、簡単に説明します。関数のテンプレートというのもありますが、ここでは扱いませんので、混乱しないようようにしてください。
実用的なクラスを作ると、その説明で読む方も書く方も疲れてしまうと思います。(いきなり、、、)そこで、実用性は考えない、簡単なクラスで考えることにします。たとえば、下のようなクラスを考えましょう。
class Iremono { int data; public: void SetData(int d){ data=d; } int GetData(){ return data; } };
このクラスはdataの入れ物です。このクラスについては、次のようなプログラムができるでしょう。
#include <iostream.h> class Iremono { int data; public: void SetData(int d){ data=d; } int GetData(){ return data; } }; void main() { Iremono x; x.SetData(3); cout<<x.GetData()<<endl; }
このようなクラスが何の役に立つのか、このプログラムはなんなんだ、、、などと言わないでください。まあ、こういうものがあったとしましょう。
ここで、ある時、気が変わって、Iremonoのデータdataを整数intではなく、実数floatにしたくなったとします。(つまり少数もありにしたくなったという意味です。あまり難しく考えないでください。)この位なら、簡単に書きかえられる、、、でしょうが、一度書いたものを、書き直すのはしゃくです。(反C++的です。とは、ちょっと言い過ぎかな。)だいたい、はじめにクラスIremonoを書いたときに、このような変更の予想が、なぜできなかったかと反省しきりです。
こういう問題を最初から考えて対処する方法はいくつかありますが、テンプレートを使うのがひとつの方法です。まず、答えを見てください。最初のクラスの定義を次のようにしておけばよかったのです。
template<class T> class Iremono { T data; public: void SetData(T d){ data=d; } T GetData(){ return data; } };
前のクラスと比べてみてください。最初にtemplate<class
T>とある他は、intがTに変わっているだけです。実は、intとかfloatとか、具体的に書く代わりに、何かわからないけど、後でここには何か「型」(組み込み型やクラス)が来るよ、それをとりあえずTと呼ぶよ、、、と言っているのです。そう言っているのが最初のtemplate<class
T>なのです。
そう思ってもう一度見てください。今度は、少しわかったような気になりませんか?
これをどう使うか、下の例を見れば、もう少しわかるかと思います。
#include <iostream.h> template<class T> class Iremono { T data; public: void SetData(T d){ data=d; } T GetData(){ return data; } }; void main() { Iremono<int> Seisu; Iremono<float> Jissu; Seisu.SetData(3); Jissu.SetData(1.5); cout<<Seisu.GetData()<<endl; cout<<Jissu.GetData()<<endl; }
このように、Iremono<int>と書くと、Tにintが入り、Iremono<flaot>と書くとTにfloatが入るのです。この話のすごいところは、Tには自分(や他のプログラマ)が定義したクラスを入れても良い、ということです。
ただ、注意しなければいけないことは、そのクラスTのインスタンスをmとしたときに、
cout<<m;
が定義されていないと、mainはエラーになります。これは別のちょっとむつかしい話になるので、今日はこの辺にしましょう。
まあ、intとfloatなんて、初心者はあまり考えない話かもしれませんが、とても重要な話題につながっていそうだ、という予感は感じられたのではないでしょうか。