2014年4月27日日曜日

開発環境

C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅣ部(高度なプログラミング概念)の21章(高度なクラス)、21.5(派生クラスのコンストラクタとデストラクタ)、設問 21-1.を解いてみる。

その他参考書籍

設問 21-1.

コード(BBEdit, Emacs)

sample433.cpp

#include <iostream>

class list {
private:
  int item;
public:
  virtual void clear() = 0;

  void next_item() {
    ++item;
  }

  list () {
    item = 0;
  }

  // 下記の理由により、clear()関数の呼び出しを削除
  virtual ~list() {
    // clear();
  }
};

class list_of_integers : public list {
public:
  int array[100];

  void clear() {
    int i;

    for (i = 0; i < 100; ++i)
      array[i] = 0;
  }
};

int main(int argc, char *argv[])
{
  list_of_integers *list_ptr = new list_of_integers;

  // デストラクタが呼び出される順序は、派生クラス、基底クラスの順
  // よって、まず派生クラスのデストラクタが呼び出されて、変数が破棄される
  // 次に、基底クラスのデストラクタが呼び出される。そしてclear関数が呼び出される
  // 基底クラスのclear関数は、純粋な仮想関数なので、派生クラスのclear関数を
  // 呼び出そうとする。すると、派生クラスの変数list_ptrはすでに破棄されている
  // なので、clear関数を呼び出すことができない。よって、変数list_ptrを削除
  // しようとすると、失敗する。
  delete list_ptr;
  list_ptr = NULL;
  return (0);
}

Makefile

CC=g++
CFLAGS=-g -Wall
all: sample433

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

clean:
 rm sample433

入出力結果(Terminal)

$ make
g++ -g -Wall -o sample433 sample433.cpp
$ ./sample433
$

0 コメント:

コメントを投稿