親クラスの引数ありコンストラクタを子クラスから初期化・動的サイズのスタック
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
スタックを実装したクラスを拡張するで、例に出したstackクラスを固定サイズでなく、サイズを動的に変更できるようにします。
動的にメモリを確保するには、new演算子を用いて、インスタンス生成時に配列のサイズを引数として渡します。
スポンサーリンク
/*********************************** Stack 動的にスタックのサイズを変更できる 整数型のスタックを実装 ***********************************/ #include <assert.h> #include <cstdlib> #include <iostream> /*********************************** stackクラス 整数型のスタックを実装するクラス メンバ関数(メソッド) init :スタック初期化 push :スタックに要素プッシュ pop :スタックから要素ポップ ***********************************/ class stack { private: int count; // スタック内の要素の数 protected: int *data; // スタックデータへのポインタ public: // コンストラクタ stack(const unsigned int size) { data = new int[size]; count = 0; } // デストラクタ virtual ~stack() { delete[] data; data = NULL; } // スタックに要素をプッシュ void push(const int item); // スタックから要素をポップ int pop(); // 要素数countをゲット int get_count(); }; // stack::push() inline void stack::push(const int item) { assert(count >= 0); data[count] = item; ++count; } // stack::pop() inline int stack::pop() { // スタックの要素数をデクリメント --count; assert(count >= 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 { private: const unsigned int stack_size; // 基本スタックのサイズ public: // コンストラクタ。初期化。 c_stack(const unsigned int size) : stack(size), stack_size(size) {} // スタックに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(200); // 要素をスタックにプッシュ test_stack.push(34); test_stack.push(2); test_stack.push_two(25, 100); test_stack.push_two(422, 9); test_stack.push(8); // 要素の数 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; }
親クラスstackに・・・
// コンストラクタ stack(const unsigned int size) { data = new int[size]; count = 0; } // デストラクタ virtual ~stack() { delete[] data; data = NULL; }
と、スタック配列データのメンバ変数dataを、new演算子と引数sizeで、配列のサイズを動的に変更できるようにしています。
dataは、スタック配列データへのポインタです。
また、デストラクタでdataを空にしています。
子クラスである、c_stackクラスにも変更箇所があります。
親クラスで、sizeという引数を渡してコンストラクタでの初期化を行いますので、子クラスからインスタンス生成するときに、引数sizeを親クラスのコンストラクタに渡す必要があります。
それが以下の行。
private: const unsigned int stack_size; // 基本スタックのサイズ public: // コンストラクタ。初期化。 c_stack(const unsigned int size) : stack(size), stack_size(size) {}
子クラスのコンストラクタ宣言「c_stack(const unsigned int size)」の直後で、「stack(size)」と親クラスのコンストラクタを、引数sizeで初期化します。
また、テストルーチンでは・・・
// c_stackのインスタンス生成 c_stack test_stack(200);
と、子クラスのインスタンス生成時に、配列データのサイズを指定してコンストラクタを初期化します。
このサイズ200で、親クラスも初期化されることにより、動的なサイズのスタックを扱えるようになります。
実行結果。
現在の要素の数: 7 個 配列要素の値の合計: 600 8 9 422 100 25 2 34
スポンサーリンク
>> 次の記事 : 仮想関数・virtualキーワード
- - 関連記事 -
- 派生クラスのコンストラクタ・デストラクタ
- 派生クラスによる関数の隠蔽
- 仮想クラス
- 抽象クラス
- 仮想関数・virtualキーワード
- クラスのアクセス制限キーワード・private, protected, public
- スタックを実装したクラスを拡張する
- クラス継承・親クラスと子クラス
- static・静的メンバ関数
- static・静的メンバ変数
- 定数のconstメンバ関数をクラスに宣言
- 定数のconstメンバ変数をクラスに宣言
- フレンドクラス・friend
- フレンド関数・friend
- クラスの中にメンバ関数(メソッド)を実装する
- explicit・コンストラクタを明示する
- クラスで自動的に生成されるメンバ関数
- コピーコンストラクタ
- 引数つきのコンストラクタを持つクラス定義
- コンストラクタで自動的に初期化する
スポンサーリンク