• 12025阅读
  • 16回复

根据指针获取类名称[已解决] [复制链接]

上一主题 下一主题
离线sbtree
 
只看楼主 正序阅读 楼主  发表于: 2010-07-09
在qt中或以宏定义的方式,有没有办法利用当前的指针得到其实例对应的类名?注意不是QObject或其子类,也就是不能通过QMetaObject的方式。
举一个应用实例吧:
当我声明了一个父类A指针,并用这个指针创建了一个子类B的实例,B是继承A的,此时我想得到这个A指针指向的子类B的名称,有什么方法呢?
[ 此帖被sbtree在2010-07-09 22:13重新编辑 ]
windows 7 + VC++2008 + Qt4.5.2
离线paranoid
只看该作者 16楼 发表于: 2010-07-12
引用第15楼sbtree于2010-07-12 16:38发表的  :
仔细研究了一下,原来是指针传递的问题。我写了一个静态函数,通过传递一个指针值来返回类名,结果返回的永远是同一个。修改这个问题很简单,就是用参数的引用传递,在原来的参数之前加上const即可

typeid的参数必须是是类指针的解引用或者类的引用,所以对指针p应该是typeid(*p)
离线sbtree
只看该作者 15楼 发表于: 2010-07-12
引用第8楼sbtree于2010-07-09 23:32发表的  :
把基类的指针传给typeid得到的是基类的名称,在基类指针指向派生类事例的情况下如何得到派生类的名称呢?

按要求,我的基类中已经定义了虚函数了阿


仔细研究了一下,原来是指针传递的问题。我写了一个静态函数,通过传递一个指针值来返回类名,结果返回的永远是同一个。修改这个问题很简单,就是用参数的引用传递,在原来的参数之前加上const即可
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 14楼 发表于: 2010-07-12
谢谢两位!
根据类名再生对象在标准C++中需要些技巧,基本的方法就是利用宏定义或者模板。
boost没有用过,等看过之后可以和你们讨论讨论。
Qt的meta object system要求类必须继承QObject,而且对Qt中已经存在的类(不继承QObject)依然没办法
[ 此帖被sbtree在2010-07-12 17:10重新编辑 ]
windows 7 + VC++2008 + Qt4.5.2
离线paranoid
只看该作者 13楼 发表于: 2010-07-10
原则上我可以不使用moc而直接写出moc_xxx.cpp,那这样算不算标准?
另外我大概看了boost ,貌似也没有直接支持反射吧,能否给出boost实现反射的例子?
离线watera
只看该作者 12楼 发表于: 2010-07-10
我说的是用标准C++的方法!Qt的meta object system是要用moc进行代码处理的,不能算标准
离线paranoid
只看该作者 11楼 发表于: 2010-07-10
用boost的话,那还不如就用qt的meta object system
只要将类继承自QObject
离线watera
只看该作者 10楼 发表于: 2010-07-10
标准C++是可以通过类名生成对象的!只不过要用高级技巧。参考boost
离线sbtree
只看该作者 9楼 发表于: 2010-07-10
按要求,我的基类中已经定义了虚函数了阿
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 8楼 发表于: 2010-07-09
把基类的指针传给typeid得到的是基类的名称,在基类指针指向派生类事例的情况下如何得到派生类的名称呢?
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 7楼 发表于: 2010-07-09
引用第5楼paranoid于2010-07-09 22:26发表的  :
比如一个类A,
msvc2008产生的名字叫class A
而mingw-gcc产生的名字叫 7A
所以这个没有通用性,自己内部用可以


这个倒是问题不大,只要是固定规则就比较好处理,只要返回的名字根据编译器的不同做些处理就可以了,不过就是代码比较难看,要添加一些宏判断,而且只能是对已知的编译器进行处理。
windows 7 + VC++2008 + Qt4.5.2
离线paranoid
只看该作者 6楼 发表于: 2010-07-09
引用第4楼sbtree于2010-07-09 22:20发表的  :
我的目的还想根据类名再实例化对象呢,如果用typeid获取的类名很头文件中的不一致,我的程序就会有问题了

还要在实例化对象。。。标准c++可没这功能,java行
离线paranoid
只看该作者 5楼 发表于: 2010-07-09
比如一个类A,
msvc2008产生的名字叫class A
而mingw-gcc产生的名字叫 7A
所以这个没有通用性,自己内部用可以
离线sbtree
只看该作者 4楼 发表于: 2010-07-09
我的目的还想根据类名再实例化对象呢,如果用typeid获取的类名很头文件中的不一致,我的程序就会有问题了
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 3楼 发表于: 2010-07-09
引用第2楼paranoid于2010-07-09 22:13发表的  :
可以使用c++的关键字typeid获取类名,不过不同编译器产生的名字是不一样的

不同的编译器产生的名字不一样?有什么差别,能给点具体的事例吗?
windows 7 + VC++2008 + Qt4.5.2
离线paranoid
只看该作者 2楼 发表于: 2010-07-09
可以使用c++的关键字typeid获取类名,不过不同编译器产生的名字是不一样的
离线sbtree
只看该作者 1楼 发表于: 2010-07-09
经过一番搜索,总算有了结果,其实只要了解一下C++中的RTTI就很容易发现这个宏typeid,以前怎么就没太注意呢!!!
windows 7 + VC++2008 + Qt4.5.2
快速回复
限100 字节
 
上一个 下一个