标题:字符串QString转化成类名
作者:twodiamond
日期:2018-01-09 08:43
内容:
一般的创建一个类 是这样的语句:
ClassXXX*temp=new ClassXXX();
但现在我要实现一个这样的一个功能:
把 ClassXXX 作为一个字符串传递给一个函数,由这个函数根据传过来的字符串来创建 一个类。
比如:
intcreateClass(char *p_cls)
{
......??????????这里我应该怎么做,谢谢!!!!
}
这样做的原因是,程序在运行过程中,当需要用到某个实例时,才去创建,不希望必须先注册甚至创建好,又费内存又耗时间。
有人提议用宏的形式: ..
#1 [小韩老师 01-09 09:38]
我们编代码的时候就是在进行文本编辑,你在编译前代码都是以文本的形式存在,很多宏的处理就是对文本的函数化处理,或者对变量中的内容文本化处理。Class##name就是将class和name变量中定义的的变量的值连接,比如定义了name=“my”,那就是Classmy这个类了,所以你的定义的中必须定义了这个类。Class#name()作用和上边的一样,把#name是字符串化。
#2 [twodiamond 01-09 10:00]
多谢小韩老师!
只是不清楚它这个宏如何能实现字符串到实例创建。
#3 [夜雨触花 01-10 15:14]
没记错的话##表示连接,应该是这样吧,你少打了个#号:
#define createClass(name) \
Class##name *temp = new Class##name();
比如name定义为"AAA",Class##name *temp = new Class##name()
大概是转成这样:
ClassAAA *temp = new ClassAAA();
说实话这种实现方法我判断不出是否能用,感觉很可能编译不过。
你是有多个类可能要实例化么?那为什么不用枚举呢:
enum ClassType {ClassA, ClassB, ClassC};
int createClass(ClassType type)
{
switch(type)
{
......
}
}
#4 回 夜雨触花 的帖子 [twodiamond 01-10 19:07]
夜雨触花:没记错的话##表示连接,应该是这样吧,你少打了个#号:
#define createClass(name) \
Class##name *temp = new Class##name();
比如name定义为"AAA",Class##name *temp = new Class##name()
....... (2018-01-10 15:14)
因为实在运行时创建实例,使用switch case需要穷举要用到的类
谢谢!
#5 [cluckly 01-10 21:14]
具体这么做的原因是什么呢?
如果是想实现工厂模式, 可以参考QApplication的setStyle
QStyle *setStyle(const QString &style)
Qt的style可以通过插件方式加载.
假定我们实现了一个叫MyDarkStyle的style插件类, 这个类实现了QStyle接口
那么我们可以通过加载同名dll插件, 然后从中得到一个MyDarkStyle类的实例. 但在App中来看这个类是一个QStyle类.