仮引数を受け取るコンストラクタ

2019年4月13日
C++
#include <iostream>
using namespace std;

#define SIZE 10

// 文字列を保存するstackクラスを宣言する
class stack {
  char stck[SIZE];    // スタック領域を確保する
  int tos;            // スタック先頭の索引
  char who;           // スタックを識別する
public:
  stack(char c);      // コンストラクタ
  void push(char ch); // スタックに文字をプッシュする
  char pop();         // スタックから文字をポップする
};

// スタックを初期化する
stack::stack(char c)
{
  tos = 0;
  who = c;
  cout << "生成 スタック" << who << "\n";
}

// 文字をプッシュする
void stack::push(char ch)
{
  if (tos == SIZE) {
    cout << "スタック" << who << "は一杯です\n";
    return;
  }
  stck[tos] = ch;
  tos++;
}

// 文字をポップする
char stack::pop()
{
  if (tos == 0) {
    cout << "スタック" << who << "は空です";
    return 0;
  }
  tos--;
  return stck[tos];
}

int main()
{
  // 自動的に初期化される2つのスタックを作成する
  stack s1('A'), s2('B');
  int i;

  s1.push('a');
  s2.push('x');
  s1.push('b');
  s2.push('y');
  s1.push('c');
  s2.push('z');

  // これによってエラーメッセージが出力される
  for (i = 0; i < 5; i++) cout << "s1をポップする: " << s1.pop() << "\n";
  for (i = 0; i < 5; i++) cout << "s2をポップする: " << s2.pop() << "\n";

  return 0;
}
$ g++ sample7.cpp
$ ./a.out
生成 スタックA
生成 スタックB
s1をポップする: c
s1をポップする: b
s1をポップする: a
s1をポップする: スタックAは空です
s1をポップする: スタックAは空です
s2をポップする: z
s2をポップする: y
s2をポップする: x
s2をポップする: スタックBは空です
s2をポップする: スタックBは空です