2014年3月20日木曜日

開発環境

C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅢ部(高度な型とクラス)の14章(クラス - その2)、14.7(プログラミング実習)、実習 14-3.を解いてみる。

その他参考書籍

実習 14-3.

コード(BBEdit, Emacs)

sample244_3.cpp

#include <iostream>
#include <assert.h>

const int STACK_SIZE = 100;

class stack {
private:
  int count;
  int data[STACK_SIZE];
  bool locked;
  int locked_by;
public:
  stack() {
    count = 0;
    locked = false;
  }
  stack(const stack& old_stack);
  // ~stack()
  // operator = (const stack& old_stack)
  void push(const int item);
  int pop();
  
  friend class access_stack;
};

inline stack::stack(const stack& old_stack) {
  int i;

  for (i = 0; i < old_stack.count; ++i) {
    data[i] = old_stack.data[i];
  }
  count = old_stack.count;
}

inline void stack::push(const int item) {
  assert(count >= 0 &&
         count < static_cast<int>(sizeof(data)/sizeof(data[0])));
  data[count] = item;
  ++count;
}

inline int stack::pop() {
  --count;
  assert(count >= 0 &&
         count < static_cast<int>(sizeof(data) / sizeof(data[0])));
  return (data[count]);
}

class access_stack {
private:
  static int class_id;
  int id;
public:
  access_stack() {
    id = class_id;
    ++class_id;
  }
  // access_stack(const access_stack& old_access_stack)
  // ~access_stack()
  // operator = (const access_stack& old_access_stack)
  void p(const stack& s);
  void lock(stack& s);
  void unlock(stack& s);
};

int access_stack::class_id = 0;

inline void access_stack::p(const stack& s)
{
  int i = 0;
  for(i = 0; i < s.count; ++i) {
    std::cout << s.data[i] << ' ';
  }
  std::cout << '\n';
}

inline void access_stack::lock(stack& s)
{
  if (s.locked)
    std::cout << "既にロック済か、他のインスタンスがスタックを使用中です\n";
  else {
    std::cout << "スタックをロックしました\n";
    s.locked = true;
    s.locked_by = id;
  }
}

inline void access_stack::unlock(stack& s)
{
  if (s.locked_by == id) {
    std::cout << "ロックを解除しました\n";
    s.locked = false;
  } else
    std::cout << "他のインスタンスにロックされたのでロックを解除できません\n";
}

int main()
{
  stack a_stack;
  access_stack a_access_stack1;
  access_stack a_access_stack2;
  int i;

  for (i = 0; i < 10; ++i) {
    a_stack.push(i);
  }
  a_access_stack1.lock(a_stack);
  a_access_stack2.lock(a_stack);
  a_access_stack1.p(a_stack);
  a_access_stack2.unlock(a_stack);
  a_access_stack1.unlock(a_stack);

  a_access_stack2.lock(a_stack);
  a_access_stack1.lock(a_stack);
  a_access_stack2.p(a_stack);
  a_access_stack1.unlock(a_stack);
  a_access_stack2.unlock(a_stack);
  
  return (0);
}

Makefile

#
# FSFのg++コンパイラ用のMakefile
#
CC=g++
CFLAGS=-g -Wall
all: sample244_3

sample244_3: sample244_3.cpp
 ${CC} ${CFLAGS} -o sample244_3 sample244_3.cpp

clean:
 rm sample244_3

入出力結果(Terminal)

$ make && ./sample244_3
g++ -g -Wall -o sample244_3 sample244_3.cpp
スタックをロックしました
既にロック済か、他のインスタンスがスタックを使用中です
0 1 2 3 4 5 6 7 8 9 
他のインスタンスにロックされたのでロックを解除できません
ロックを解除しました
スタックをロックしました
既にロック済か、他のインスタンスがスタックを使用中です
0 1 2 3 4 5 6 7 8 9 
他のインスタンスにロックされたのでロックを解除できません
ロックを解除しました
$

0 コメント:

コメントを投稿