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