• 2784阅读
  • 6回复

[提问]字符串QString转化成类名 [复制链接]

上一主题 下一主题
离线twodiamond
 

只看楼主 倒序阅读 楼主  发表于: 2018-01-09
一般的创建一个类 是这样的语句:
    ClassXXX  *temp=new ClassXXX();

但现在我要实现一个这样的一个功能:
把 ClassXXX 作为一个字符串传递给一个函数,由这个函数根据传过来的字符串来创建 一个类。
  
比如:
  int  createClass(char *p_cls)
  {

       ......??????????这里我应该怎么做,谢谢!!!!
  }  


这样做的原因是,程序在运行过程中,当需要用到某个实例时,才去创建,不希望必须先注册甚至创建好,又费内存又耗时间。


有人提议用宏的形式:
#define createClass(name) \
  Class##name * temp = new Class#name();




说实话,没看明白这个宏有什么意义?



谢谢!
离线小韩老师

只看该作者 1楼 发表于: 2018-01-09
我们编代码的时候就是在进行文本编辑,你在编译前代码都是以文本的形式存在,很多宏的处理就是对文本的函数化处理,或者对变量中的内容文本化处理。Class##name就是将class和name变量中定义的的变量的值连接,比如定义了name=“my”,那就是Classmy这个类了,所以你的定义的中必须定义了这个类。Class#name()作用和上边的一样,把#name是字符串化。
离线twodiamond

只看该作者 2楼 发表于: 2018-01-09
多谢小韩老师!
只是不清楚它这个宏如何能实现字符串到实例创建。
离线夜雨触花

只看该作者 3楼 发表于: 2018-01-10
没记错的话##表示连接,应该是这样吧,你少打了个#号:
#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)
    {
        ......
    }
}
离线twodiamond

只看该作者 4楼 发表于: 2018-01-10
回 夜雨触花 的帖子
夜雨触花:没记错的话##表示连接,应该是这样吧,你少打了个#号:
#define createClass(name) \
  Class##name *temp = new Class##name();
比如name定义为"AAA",Class##name *temp = new Class##name()
....... (2018-01-10 15:14) 

因为实在运行时创建实例,使用switch case需要穷举要用到的类
谢谢!
离线cluckly

只看该作者 5楼 发表于: 2018-01-10
具体这么做的原因是什么呢?

如果是想实现工厂模式, 可以参考QApplication的setStyle

QStyle *    setStyle(const QString &style)

Qt的style可以通过插件方式加载.

假定我们实现了一个叫MyDarkStyle的style插件类, 这个类实现了QStyle接口

那么我们可以通过加载同名dll插件, 然后从中得到一个MyDarkStyle类的实例. 但在App中来看这个类是一个QStyle类.


离线大漠之鹰

只看该作者 6楼 发表于: 2018-01-11
1、可以用Qt提供的插件模式来实现
2、可以用Qt提供的元对象反射机制来实现
这两种方式都可以在运行时创建对应的实例
本是后山人,偶作前堂客,醉舞经阁半卷书,坐井说天阔。大志戏功名,海斗量福祸,论到囊中羞涩时,怒指乾坤错
QQ:874164244
快速回复
限100 字节
 
上一个 下一个