型が違っても、同じ関数で取り扱うことができるテンプレート関数については、随分前にやった・・・。
テンプレートクラスはそのクラス版で、あらゆる型で同じように扱うことができるクラスである・・・。
あらゆる型を要素にできるスタッククラスを作ってみる・・・。
汎用スタックテンプレートクラスclass_stackの定義は、
こんな感じ・・・。
T型ポインタstack_にスタック用の動的配列アドレスが入る・・・。
index_はスタックポインタの現在位置、size_はスタックのサイズである・・・。
コンストラクタは、スタックのサイズを引数に取り、指定が無い場合のデフォルト値は10・・・。
T型の追加要素を引数に取る追加メンバ関数push、T型の取出し要素を戻り値とする追加メンバ関数pop・・・。
テンプレートクラスは、ヘッダとソースを分割コンパイルできないため、stack.hにメンバ関数の実装も書く・・・。
メンバ関数にもいちいちtemplate~を付けないといけない・・・。
コンストラクタは、引数のstack_sizeをメンバのsize_に格納・・・。
stack_のサイズはsize_ + 1にして、newでT型動的配列を作成・・・。
最後の要素は番兵なので-1を入れておく・・・。(使わないけど・・・。)
デストラクタは、stack_のポインタが残っていれば解放・・・。
pushは、index_がsize_と同じなら、満杯とみなし、falseを返す・・・。
そうでなければ、空いているということなので、varをstack_のindex_番目に代入・・・。
そのあとindex_を増やし、trueを返す・・・。
popの場合は、index_が0なら空ということなので、NULLを返す・・・。(std::stringなど型によっては落ちる(警告も出ている)ので、この実装は再考したほうがいい・・・。)
そうでない場合は、index_を減らしてから、stack_[index_]を戻り値に返している・・・。
main.cppは、
int型class_stackとchar型class_stackのオブジェクトをそれぞれ用意・・・。(どちらも要素数3・・・。)
int_stackに1, 2, 3、char_stackに'A', 'B', 'C'と追加してから、どちらもpopですべて取り出し、その要素を出力・・・。
実行すると、
$ g++ main.cpp -o main $ ./main 3 2 1 C B A $
3, 2, 1、そして'C', 'B', 'A'と逆方向に取り出される・・・。
Sample/cpp/template_class/template_class/src/template_class at master · bg1bgst333/Sample · GitHub