2010年5月23日日曜日

C++でオブジェクトのクラス名(型名)文字列を実行時に取得する

今日はC++オブジェクトクラス名を実行時に取得する方法を紹介します。
紹介するといってもtypeid()という関数を使用するだけです。typeid()はtypeinfo.hで定義されているのでincludeする必要があります。
typeid()の引数には変数オブジェクトや型名(クラス名)を直接指定することが出来ます。
またtypeid()の戻り値同士を比較したりも出来ます。

サンプルコードを用意しました。

main.cpp
#include 
#include 
#include "ConcreteClass.h"

void main(void)
{
    //  ConcreteClassオブジェクト生成
    AbstractClass* obj = new ConcreteClass();

    //  型名取得
    const type_info& id = typeid(*obj);
    printf("%s\n", id.name());

    //  method()の呼び出し
    obj->method();

    //  型を直接指定し型名を取得し比較
    if (typeid(ConcreteClass) == id) {
        printf("true\n");
    }

    delete obj;

    printf("hit any key...\n");
    while(getchar() == EOF) {}
}

AbstractClass.h
#ifndef _ABSTRACT_CLASS_H_
#define _ABSTRACT_CLASS_H_

#include 
#include 

class AbstractClass
{
    //----------------------------------
    //  method
    //----------------------------------
public:
    void method() {
        //  型情報の取得
        const type_info& id = typeid(*this);

        //  表示
        printf("AbstractClass-typeid:%s\n", id.name());

        //  subMethod()の呼び出し
        this->subMethod();
    }

protected:
    virtual void subMethod() = 0;
};
#endif

ConcreteClass.h
#ifndef _CONCRETE_CLASS_H_
#define _CONCRETE_CLASS_H_

#include 
#include 
#include "AbstractClass.h"

class ConcreteClass : public AbstractClass
{
 //----------------------------------
 // method
 //----------------------------------
public:
 ConcreteClass() {
  // do nothing...
 }

 virtual ~ConcreteClass() {
  // do nothing...
 }

protected:
 virtual void subMethod() {
  // 型情報の取得
  const type_info& id = typeid(*this);

  // 表示
  printf("ConcreteClass-type_id:%s\n", id.name());
 }

};
#endif

0 件のコメント:

コメントを投稿