デバッガーが使えないときのオブジェクト型の取得
イベントドリブンなプログラムのフレームワークで、イベントを駆動する直前で何のイベントを実行しようとしてるか表示したい。デバッガーが使えるときならイベント型から派生したオブジェクトの型はすぐわかるけど、使えない状況でオブジェクトの型情報を得るにはどうするか?C++では実行時型識別(RTTI)を使う。こんなかんじにすると実行されるイベント名がトレースできる↓
#include<iostream> #include<typeinfo> //詳細省略 class CEvent{};//基底クラス class CEvent1:public CEvent{};//派生クラス class CEvent2:public CEvent{};//派生クラス //イベント駆動フレームワーク void main_loop(){ while(1){ CEvent* p_event= getNextEvent();//次イベント取得 //イベントの型名を出力 //typeid演算子はconst type_info &を返す std::cout<<(typeid(*p_event)).name()<<std::endl; p_event->onEvent();//イベント実行 delete p_event;//イベント削除 } }
追記:g++ではそのまま使えるけど、VC++の場合は、プロジェクト→プロパティ→C/C++→言語→ランタイム型情報を有効にするをチェックしないと動かない模様。てかVC使えるならデバッグにこんな手間なことする必要すらないけど。