親クラスの引数ありコンストラクタを子クラスから初期化・動的サイズのスタック

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