スタックを実装したクラスを拡張する
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
C++のクラス定義・クラスでのスタック実装で書いた、スタックを扱うクラスを少し改良し、子クラスで機能を拡張させてみます。
継承する子クラスで拡張する機能は、以下の2つの機能を拡張します。
スポンサーリンク
1.2つの要素をいっぺんにpushできるようにする。
2.現在のデータの値の合計を求める。
/*********************************** Stack 整数型のスタックを実装 ***********************************/ #include <assert.h> #include <cstdlib> #include <iostream> const int STACK_SIZE = 100; // スタックの最大サイズ /*********************************** stackクラス 整数型のスタックを実装するクラス メンバ関数(メソッド) init :スタック初期化 push :スタックに要素プッシュ pop :スタックから要素ポップ ***********************************/ class stack { private: // このクラスからのみアクセス可能 int count; // スタック内の要素の数 protected: // 子クラスからアクセス可能にする int data[STACK_SIZE]; // 要素 public: // スタック初期化 void init(); // スタックに要素をプッシュ void push(const int item); // スタックから要素をポップ int pop(); // 要素数countをゲット int get_count(); }; // stack::init() inline void stack::init() { count = 0; // スタックの要素数を0に設定 } // stack::push() inline void stack::push(const int item) { assert((count >= 0) && (count <= static_cast<int>(sizeof(data)/sizeof(data[0])))); data[count] = item; ++count; } // stack::pop() inline int stack::pop() { // スタックの要素数をデクリメント --count; assert((count >= 0) && (count < static_cast<int>(sizeof(data)/sizeof(data[0])))); // 最後の値を返す return (data[count]); } // stack::get_count() inline int stack::get_count() { return count; } /*********************************** c_stackクラス 2つの要素をpush可能にする メンバ関数 push_two -- 2つ要素を追加 total -- 要素の値を合計 ***********************************/ class c_stack : public stack { public: // スタックに2つの要素をプッシュ void push_two(const int item1, const int item2); // 要素の値を合計 int total(); }; // stack::push_two() inline void c_stack::push_two(const int item1, const int item2) { // 親クラスstackのメンバ関数stackを使用 stack::push(item1); stack::push(item2); } // stack::total(); inline int c_stack::total() { int i; // 配列のインデックス int total = 0; // 合計 int array_count = get_count(); // 配列の要素数 for (i = 0; i < array_count; i++) { total += data[i]; } return total; } /************************************** * テストルーチン **************************************/ int main() { // c_stackのオブジェクト生成 c_stack test_stack; test_stack.init(); // stackの初期化 // 要素をスタックにプッシュ test_stack.push(5); test_stack.push(7); test_stack.push_two(12, 300); test_stack.push_two(3776, 8); test_stack.push(2); // 要素の数 int cur_count = test_stack.get_count(); std::cout << "現在の要素の数: "; std::cout << cur_count << " 個\n\n"; // 配列要素の値の合計 std::cout << "配列要素の値の合計: "; std::cout << test_stack.total() << "\n\n"; // スタックから要素をポップ for (int i = 0; i < cur_count; i++) { std::cout << test_stack.pop() << "\n"; } return 0; }
「test_stack.push_two(3776, 8);」と、要素を2ついっぺんに追加できます。
また、親クラスのpush, popメンバ関数は、public宣言なので、子クラスのインスタンスからもアクセス可能です。
stackクラスで定義されている要素数を表すcountは、private宣言です。
直接countの値を参照できないので、要素数countを返すpublicなint get_count();を定義しています。
要素の合計の値を返す、c_stackクラスのメンバ関数total()は、スタック配列であるstackクラスのメンバ変数dataにアクセスする必要があります。
ですので、変数dataは、protectedで宣言しています。
実行結果。
現在の要素の数: 7 個 配列要素の値の合計: 4110 2 8 3776 300 12 7 5
スタック配列の要素の値の合計が、c_stackクラスのメンバ関数total()で求められます。
また、要素は7個となっており、またループ制御でpopすると、上記のように要素の値が取り出されます。
スタックは、LIFO(last-in first-out)ですので、後入れ先出しです。
つまり、後から追加されたデータが、先に取り出されるデータ構造となりますので、最後に追加された「2」が最初に取り出されています。
スポンサーリンク
<< 前の記事 : クラス継承・親クラスと子クラス
- - 関連記事 -
- 派生クラスのコンストラクタ・デストラクタ
- 派生クラスによる関数の隠蔽
- 仮想クラス
- 抽象クラス
- 仮想関数・virtualキーワード
- 親クラスの引数ありコンストラクタを子クラスから初期化・動的サイズのスタック
- クラスのアクセス制限キーワード・private, protected, public
- クラス継承・親クラスと子クラス
- static・静的メンバ関数
- static・静的メンバ変数
- 定数のconstメンバ関数をクラスに宣言
- 定数のconstメンバ変数をクラスに宣言
- フレンドクラス・friend
- フレンド関数・friend
- クラスの中にメンバ関数(メソッド)を実装する
- explicit・コンストラクタを明示する
- クラスで自動的に生成されるメンバ関数
- コピーコンストラクタ
- 引数つきのコンストラクタを持つクラス定義
- コンストラクタで自動的に初期化する
スポンサーリンク