親クラスの引数ありコンストラクタを子クラスから初期化・動的サイズのスタック
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
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・コンストラクタを明示する
- クラスで自動的に生成されるメンバ関数
- コピーコンストラクタ
- 引数つきのコンストラクタを持つクラス定義
- コンストラクタで自動的に初期化する
スポンサーリンク