C++ Module 05

インタラクティブ学習ガイド

Module 05へようこそ

このモジュールでは、C++の**例外処理**を深く学びます。単に`try-catch`を使うだけでなく、エラー状況をクラスとして表現し、継承やポリモーフィズムを活用して、堅牢で柔軟なシステムを設計する手法を習得します。

テーマ:官僚制 (Bureaucracy)

このモジュールでは「官僚制」というユニークな世界観を通して学習を進めます。複雑で階層的なシステムをシミュレートするのに最適なテーマです。「階級が足りない」「書類が未署名」といった問題をプログラムの「例外」として捉え、エラーハンドリングを直感的に学びましょう。

課題シミュレーション

各エクササイズの機能をインタラクティブに試してみましょう。

EX00: Bureaucratの誕生

👤 Zaphod

Grade: 75

やってみよう:

官僚のGradeを増減させてみましょう。Gradeが1の時にインクリメント、または150の時にデクリメントしようとすると例外が発生します。

EX01: Formへの署名

👤 Ford

Grade: 50

この官僚で下のフォームに署名できます。

📋 Tax Form 27B/6

署名要件 Grade: 75

状態: 未署名

EX02: Formの実行

👤 Trillian

Grade: 20

Shrubbery Creation

署名: 145 / 実行: 137

状態: 未署名

Robotomy Request

署名: 72 / 実行: 45

状態: 未署名

Presidential Pardon

署名: 25 / 実行: 5

状態: 未署名

EX03: InternによるForm生成

🧑‍💻

Intern

生成したいフォーム名を入力してください:

"shrubbery creation", "robotomy request", "presidential pardon"が有効です。

ここにフォームが生成されます...

登場人物と概念

👤 Bureaucrat

システムの操作単位。名前と1~150の階級(Grade)を持つ。階級に応じてFormへの署名や実行が可能。

主な機能:

  • `incrementGrade()` / `decrementGrade()`: 階級の増減。
  • `signForm(Form&)`: フォームへの署名。
  • `executeForm(AForm const&)`: フォームの実行。

📋 AForm (抽象クラス)

全てのフォームの基底クラス。「署名・実行に必要なGrade」など共通の属性と機能を持つ。`performAction()`という純粋仮想関数を持ち、具体的なアクションは派生クラスに実装を強制する。

ポイント:

ポリモーフィズムを実現する要。`AForm*`ポインタでどの種類のフォームも同じように扱える。

🧑‍💻 Intern

フォームを動的に生成する専門家。フォーム名(文字列)を受け取り、対応するフォームオブジェクトを生成して返す。

ポイント:

**ファクトリーパターン**を実装。オブジェクトの生成ロジックをカプセル化し、クライアントコードを具体的なクラス名から分離する。

技術詳細

なぜ`what()`に`throw()`が必要?

C++98では、`std::exception`を継承して独自の例外クラスを作る際、`what()`メソッドの宣言に`throw()`を付けることが必須でした。これは**「基底クラスの仮想関数をオーバーライドするときのルール」**に基づいています。

class GradeTooHighException : public std::exception {
public:
virtual const char* what() const throw();
};

基底クラスである`std::exception`の`what()`メソッドが「例外を投げない(`throw()`)」と宣言しているため、それをオーバーライドする派生クラスも同じ約束を守らなければならない、というルールです。これにより、ポリモーフィズムを通じて例外を安全に扱うことが保証されます。

現代のC++では (`noexcept`)

`throw()`という動的例外仕様はC++11で非推奨となり、代わりにより強力な`noexcept`キーワードが導入されました。もしC++11以降の規格でコンパイルする場合、`noexcept`を使うのが正しい作法となります。

実践的な応用例

このモジュールで学んだ概念は、実際のソフトウェア開発で広く使われています。

データベースシステム

接続失敗、クエリ実行エラー、トランザクションの競合などを、それぞれ異なる例外クラスとして定義し、状況に応じた後処理(ロールバックなど)を行います。

GUIアプリケーション

ユーザーが存在しないファイルを開こうとしたり、不正な形式のデータを入力した場合に、カスタム例外を投げて適切なエラーダイアログを表示します。

Webサーバー

HTTPリクエストの解析中に不正なリクエスト(`400 Bad Request`)や、リソースが見つからない場合(`404 Not Found`)を例外として処理し、適切なHTTPステータスコードを返します。

プラグインシステム

ファクトリーパターンを使い、実行時に設定ファイルから読み込んだ情報に基づいて、様々なプラグイン(この課題の`AForm`に相当)を動的に生成・ロードします。