C/C++|Qt工作笔记-4种方法判断当前对象(类)名或标识(继承发,typeid法,元对象className()法,Q_CLASSINFO法)

回想起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官方解析与实例

https://blog.csdn.net/qq78442761/article/details/83006645

本人的这篇博文已经写出来了!

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页