第37章 クラステンプレート その2


今回も、クラステンプレートです。まずは、例題を見てください。



// clsstemp3.cpp #include <iostream.h> #include <stdio.h> #include <string.h> template <typename T, int N> class Ret{ public: void show(T x); }; template <typename T, int N> void Ret <T, N> :: show(T x) { int i; for (i = 0; i < N; i++) cout << x; return; } int main() { Ret<char, 25> MyChar; Ret<int, 1> MyInt; Ret<char *, 1>MyStr; MyChar.show('*'); cout << endl; MyStr.show("粂井康孝"); cout << endl; MyStr.show("http://www.kumei.ne.jp"); cout << endl; MyStr.show("年齢:"); MyInt.show(23); cout << endl; MyChar.show('*'); cout << endl; return 0; }

上のプログラムの実行結果は

これは、showメンバ関数の引数をN回繰り返して表示するというものです。



使い方は、わかったでしょうか。 では、もう少し別な例を見てみましょう。

// clsstemp4.cpp #include <iostream.h> #include <string.h> #include <conio.h> template <typename TN, int c> class Mem { TN *ptn; public: Mem() { ptn = new TN[c]; if (ptn == NULL) cout << "Error!" << endl; else cout << "メモリを確保しました" << endl; }; ~Mem() { delete []ptn; cout << "メモリを解放しました" << endl; }; TN *getptr() { return ptn; }; }; int main() { int *pint, i; char *pmystr; Mem<int, 10> MyInt; Mem<char, 32> MyStr; pint = MyInt.getptr(); for (i = 0; i < 10; i++) pint[i] = i + 1; for (i = 0; i < 10; i++) cout << pint[i] << ", "; pmystr = MyStr.getptr(); strcpy(pmystr, "粂井康孝"); cout << pmystr << endl; getch(); return 0; }

コンストラクタで要素c個のTN型の配列を確保しています。
デストラクタで解放しています。
メンバ関数getptrでは、確保した配列の先頭の要素のアドレスを返しています。

このクラスを使う方では

Mem<int, 10> MyInt;

とすれば、int型で要素が10の配列が確保されます。アドレスはgetptrメンバ関数を 使って

ptr = MyInt.getptr();

で取得することができます。

上のプログラムの実行結果はどうなるでしょうか。

このプログラムをmallocを使って書き直してみてください。


[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Aug/18/2000 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。