C++のクラス定義・クラスでのスタック実装

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
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
スポンサーリンク
 
スポンサーリンク