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 1class 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
本人的这篇博文已经写出来了!
C/C++|Qt工作笔记-4种方法判断当前对象(类)名或标识(继承发,typeid法,元对象className()法,Q_CLASSINFO法)相关推荐
- Qt工作笔记-两种方法从容器中筛选出父类和子类(继承法、typeid法)
两种方法程序运行界面效果都一样! 程序运行截图如下: 这个图随便看看就可以了,没啥用! 代码如下: widget.h #ifndef WIDGET_H #define WIDGET_H#include ...
- Qt工作笔记-三种方式解决Qt5中文编码问题
目录 前言 方式一 方式二 方式三 三种方式解决Qt5中文编码问题 前言 这里不谈原理,只说如何去做! 这里本人自己总结下,今天遇到了新的编码问题,在此记录下,方面以后快速调用. 把这三种方法顺序试下 ...
- C++工作笔记-3种方法对数据类型进行拆分(可用于各种协议)
比如用Long Long存3个数据的内容. 这里要知道大小端的知识点. 方法一是用位运算: 方法二是用指针: 方法三是结构体(本质上也是指针): 运行截图如下: 源码如下: main.cpp #inc ...
- Qt工作笔记-在界面上输出变量、类、this指针的地址
思路: 地址就一4字节数,把其转10进制,再转成16进制就可以在界面上显示了. 程序运行截图如下: 源码如下: widget.h #ifndef WIDGET_H #define WIDGET_H#i ...
- Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包
原理以及运行 原理是因为QJsonDocument提供了一个函数toJson 可以直接把Json数据转成QByteArray,这样就可以直接发送数据包,然后再按照常规方法解析即可,本源码中含解析内容, ...
- Python语言学习:基于python五种方法实现使用某函数名【func_01】的字符串格式('func_01')来调用该函数【func_01】执行功能
Python语言学习:基于python五种方法实现使用某函数名[func_01]的字符串格式('func_01')来调用该函数[func_01]执行功能 目录 问题提出 代码五种设计思路 T1方法:e ...
- python比较两个二进制文件_python三种方法判断文件是否为二进制文件
两种方法判断文件是否为二进制文件,最准确的就是把这两种方法结合起来. (1)方法一: 它首先检查文件是否以BOM开始,如果不在初始8192字节内查找零字节: import codecs file_pa ...
- python 子串是否在字符串中_python七种方法判断字符串是否包含子串
1. 使用 in 和 not in in 和 not in 在 Python 中是很常用的关键字,我们将它们归类为 成员运算符. 使用这两个成员运算符,可以很让我们很直观清晰的判断一个对象是否在另一个 ...
- js之删除对象属性的三种方法 判断对象中是否有某一属性的四种方法
js之删除对象属性的三种方法 & 判断对象中是否有某一属性的四种方法 示例 1.基础版 var a = { id: 18, age: 20, name: "zhangsan" ...
最新文章
- node.js入门 - 2.创建一个简单聊天室
- 设计模式-观察者模式 实现
- jfinal mysql date,jfinal与mysql数据类型拾掇大全
- 将Android源码集成到Eclipse中的方法
- MATLAB xlswrite函数出现“错误: 服务器出现意外情况”
- 广东制造按下加速键 千家中小企业上阿里云工业互联网
- java里的日期时间
- mysql中修改表的还原命令_MySQL的增、删、改、查和备份、恢复的命令
- discuz自动添加兼容html5标签的音乐播放器
- PowerShell 使用当前日期创建文件夹
- 单片机c语言1602怎么接线,lcd1602中文资料分享:lcd1602接线图_lcd1602与单片机连接图 - 全文...
- SOP封装的后缀字母L M N都代表什么意思?
- C语言程序设计第六次作业
- SIGIR20|LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation
- 一阶二阶数字滤波器笔记
- java 同步数据,同步数据到另一个库中。
- Windows环境下OpenSSL下载安装及制作证书
- 用全站 CDN 部署 Discourse 论坛
- 【文献阅读】VAQF: Fully Automatic Software-Hardware Co-Design Framework for Low-Bit Vision Transformer
- html横向导航栏滑动效果,用css3如何实现导航栏横向拖曳滚动