C++のクラス定義・クラスでのスタック実装
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
前ページで、構造体でのスタック実装を見ました。
構造体でもスタックを実装できましたが、この場合、構造体のデータへのアクセス保護などは考慮されていません。
スポンサーリンク
C++のクラスを利用すれば、構造体のようにデータを保持すると同時に、データを操作する一連の関数(メソッド)とアクセス保護を設定できます。
まずは、C++のクラス定義の仕方を軽く見てみます。
C++のクラス
// スタッククラス
class stack {
private:
int count; // スタック内の要素の数
int data[STACK_SIZE]; // 要素
public:
// スタック初期化
void init();
// スタックにプッシュ
void push(const int item);
// スタックからポップ
int pop();
};
クラス内で、private宣言を行ったメンバ(メンバ変数とメンバ関数、またはプロパティとメソッド)には、クラスの外部からはアクセスできません。
アクセス制限には、private、public、protected の3種類があり、publicは、クラス外部からもアクセスできます。
protectedは、クラス内および継承クラスからアクセスできます。
このあたりのアクセス制限は、PHPと同じですので、PHPが分かればC++も理解しやすいですね。
C++クラスでのスタック実装
/***********************************
Stack
整数型のスタックを実装する
***********************************/
#include <assert.h>
#include <cstdlib>
#include <iostream>
const int STACK_SIZE = 100; // スタックの最大サイズ
/***********************************
stackクラス
整数型のスタックを実装するクラス
メンバ関数(メソッド)
init :スタック初期化
push :スタックに要素プッシュ
pop :スタックから要素ポップ
***********************************/
class stack {
private:
int count; // スタック内の要素の数
int data[STACK_SIZE]; // 要素
public:
// スタック初期化
void init();
// スタックに要素をプッシュ
void push(const int item);
// スタックから要素をポップ
int pop();
};
/***********************************
stack::init
スタックの初期化
************************************/
inline void stack::init() {
count = 0; // スタックの要素数を0に設定
}
/***********************************
stack::push
プッシュ演算。
スタックの最後に要素を追加して、
要素数をインクリメントする。
引数
item :追加する要素の値
戻り値 :なし
************************************/
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]);
}
// スタックをテストするためのルーチン
int main() {
// stackを使用可能にする
class stack a_stack; // stack構造体の宣言。classは省略可。
a_stack.init(); // stackの初期化
// 要素をスタックにプッシュ
a_stack.push(5);
a_stack.push(7);
a_stack.push(2);
a_stack.push(1);
a_stack.push(2);
a_stack.push(3);
// スタックから要素をポップ
std::cout << a_stack.pop() << "\n";
std::cout << a_stack.pop() << "\n";
std::cout << a_stack.pop() << "\n";
std::cout << a_stack.pop() << "\n";
std::cout << a_stack.pop() << "\n";
std::cout << a_stack.pop() << "\n";
return 0;
}
注意点としては・・・
1.クラス本体では、メンバ関数のプロトタイプを宣言。「void push(const int item);」など。
2.関数プロトタイプで宣言したメンバ関数(メソッド)を実装する。「inline void stack::push(const int item)」と、「stack::pushと「::」を書くことで、pushメソッドが、stackクラスに属する意味となります。
3.クラスの利用時には・・・「class stack a_stack;」で、新しいオブジェクトを生成し、「a_stack.push(5);」と、オブジェクト名とメンバを、「.」でつなぐことで呼び出せます。
実行結果。
3 2 1 2 7 5
スポンサーリンク
>> 次の記事 : コンストラクタで自動的に初期化する
<< 前の記事 : スタックとキュー
- - 関連記事 -
- 派生クラスのコンストラクタ・デストラクタ
- 派生クラスによる関数の隠蔽
- 仮想クラス
- 抽象クラス
- 仮想関数・virtualキーワード
- 親クラスの引数ありコンストラクタを子クラスから初期化・動的サイズのスタック
- クラスのアクセス制限キーワード・private, protected, public
- スタックを実装したクラスを拡張する
- クラス継承・親クラスと子クラス
- static・静的メンバ関数
- static・静的メンバ変数
- 定数のconstメンバ関数をクラスに宣言
- 定数のconstメンバ変数をクラスに宣言
- フレンドクラス・friend
- フレンド関数・friend
- クラスの中にメンバ関数(メソッド)を実装する
- explicit・コンストラクタを明示する
- クラスで自動的に生成されるメンバ関数
- コピーコンストラクタ
- 引数つきのコンストラクタを持つクラス定義
スポンサーリンク