C/C++|Qt工作筆記-4種方法判斷當前物件(類)名或標識(繼承發,typeid法,元物件className()法,Q_CLASSINFO法)
阿新 • • 發佈:2018-12-14
回想起3個月前,剛剛參加工作也做過類似的筆記,但只有2種方法,估計剛畢業沒有什麼墨水,經過3個月時間又多了2種方法:
這些方法都可用於RTTI
第一個方法是繼承發(C++中很推薦用這個,感覺用這個結構會很清晰):
執行截圖如下:
原始碼如下:
#include <iostream> #include <assert.h> using namespace std; #define ONEMACRO 0 #define TWOMACRO 1 class Base{ public: enum MyType { One,Two,Three,Four,Five,Six }; int getMyType()const{ return m_type; } void setMyType(int type){ m_type=type; } virtual ~Base(){ cout<<"~Base() called!"<<endl; } int m_type; }; class ImplementOne:public Base{ public: ImplementOne(){ setMyType(One); } ~ImplementOne(){ cout<<"~ImplementOne() called!"<<endl; } }; class ImplementTwo:public Base{ public: ImplementTwo(){ setMyType(Two); } ~ImplementTwo(){ cout<<"~ImplementTwo() called!"<<endl; } }; void judgment(const Base *object){ if(object->getMyType()==ONEMACRO){ cout<<"MyType is One"<<endl; /************************************************************************/ /* want to do sth */ /************************************************************************/ } else if(object->getMyType()==TWOMACRO){ cout<<"MyType is Two"<<endl; /************************************************************************/ /* want to do sth */ /************************************************************************/ } else{ assert(!"The MyType is unnormal"); } } void main(){ Base *object1=new ImplementOne; Base *object2=new ImplementTwo; judgment(object1); judgment(object2); delete object1; delete object2; getchar(); }
第二個方法是typeid法(個人還是不太喜歡用這個,可能是Qt的東西寫多了【Qt中有很多可以替代這種方法】)
執行截圖如下:
原始碼如下:
#include <iostream> #include <typeinfo> #include <assert.h> #include <string> using namespace std; class ImplementOne{ }; class ImplementTwo{ }; void main(){ ImplementOne one; ImplementTwo two; if(strcmp(typeid(one).name(),"class ImplementOne")==0){ cout<<"The class name is ImplementOne"; } else{ cout<<"he he!"<<endl; } getchar(); }
第三種方法是metaObject()->className()法,這種方法也超級簡單
執行截圖如下:
原始碼如下:
metaobject.h
#ifndef METAOBJECT_H #define METAOBJECT_H #include <QObject> class Base:public QObject { Q_OBJECT public: Base(QObject *object=0); }; class Child:public QObject { Q_OBJECT public: Child(QObject *object=0); }; #endif // METAOBJECT_H
main.cpp
#include "metaobject.h"
#include <QApplication>
#include <QMetaObject>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Base base;
Child child;
qDebug()<<base.metaObject()->className();
qDebug()<<child.metaObject()->className();
return a.exec();
}
metaobject.pp
#include "metaobject.h"
Base::Base(QObject *object)
:QObject(object)
{
}
Child::Child(QObject *object)
:QObject(object)
{
}
第四種方法也是Qt專有的Q_CLASSINFO法
在此不再重複,
Qt文件閱讀筆記-Q_CLASSINFO官方解析與例項
本人的這篇博文已經寫出來了!