首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ 反射解决方法

2012-02-17 
C++ 反射好久没来了,发个帖求教一下,请问大家在用C++的时候,遇到要用反射的地方,一般都怎么实现啊?最好是

C++ 反射
好久没来了,发个帖求教一下,请问大家在用C++的时候,遇到要用反射的地方,一般都怎么实现啊?
最好是标准的C++的解决方案,或者MFC也行。
我昨天也百度到一些方案,但是他继承了CObject,所以我有点晕,不知道他到底是用什么实现的,难不成也是MFC?
p.s.因为我想以后做游戏,但是我不太清楚做游戏的话,对于C++的要求一般是怎样的,是用MFC么?还是C++.NET?请大家指教~~~谢谢~~~

[解决办法]
貌似做c++游戏的话,难度比较大,对c++指针内存什么的要求比较高,还有就是网络编程。
[解决办法]
要玩反射,最好先玩玩RTTI,去找本C++ Primer第四版,里面讲得比较详细了。
[解决办法]
不要视图模拟语言中没有的特性……
[解决办法]
参考MFC里的反射。
[解决办法]
在《Mondern C++ Design》的工厂模式那一章中详细讲了实现反射的原理。

[解决办法]
MFC其实没有.Net方便啊,个人认为
[解决办法]
如果是编译期的反射,通过模板可以解决。
运行期的反射,需要在对象内部或者其他地方维护关于对象类型、内存布局、方法名称,方法入口地址等所需的元数据信息。
[解决办法]
JAVA,C#这类的东西,都有一个最终祖先类。类似MFC的CObject。通过类名得到类,就需要一个共同祖先。函数里面其实也就是switch,好的实现,可以用个map之类的查表法。

[解决办法]

C/C++ code
#include <iostream>class A{public:        A(){std::cout<<"A()"<<std::endl;}        virtual int print(){std::cout<<"A"<<std::endl;}        virtual ~A(){std::cout<<"~A()"<<std::endl;};};class B:public A {public:        B(){std::cout<<"B()"<<std::endl;}        int print(){std::cout<<"B"<<std::endl;}        ~B(){std::cout<<"~B()"<<std::endl;}};extern "C" {A* fun_A(){A x;return &x;};B* fun_B(){B x;return &x;}}[root@FC5 cppclass]# cat test.cpp/*test.c*/#include <iostream>#include <dlfcn.h>class A{public: A(); int print(); ~A();};//A* fun_A();A* (*fun)();int main(int argc,char ** argv){void *dp;char *error;dp=dlopen(argv[1], RTLD_LAZY);if(!dp){        fprintf(stderr, "%s\n", dlerror());        return -1;}dlerror();std::cout<<argv[2]<<std::endl;fun=reinterpret_cast<A* (*)() >(dlsym(dp, argv[2]));if((error = dlerror()) != NULL) {        std::cerr<<"ERR:"<<error<<std::endl;}fun()->print();dlclose(dp);return 0;}
[解决办法]
用map实现反射的简单例子。

C/C++ code
#include <iostream>#include <string>#include<map>using namespace std;class Base{public:    virtual void say()=0;};class A:public Base{public:    virtual void say()    {        cout<<"This is A"<<endl;    }};class B:public Base{public:    virtual void say()    {        cout<<"This is B"<<endl;    }};template <typename T>Base *Create()                  //创建函数{    return new T;}typedef Base*(*FUN)();map<string, FUN> rmap;      //由类名到创建函数的映射int main() {    rmap["A"]=Create<A>;     //注册    rmap["B"]=Create<B>;     //注册    string str="A";    Base* p=rmap[str]();     //动态创建    p->say();    delete p;    str="B";    p=rmap[str]();         //动态创建    p->say();    delete p;}
[解决办法]
QT有反射的 呵呵

[解决办法]
可以参考MFC那套宏.DECLARE_DYNAMIC_CREATE .在模块被加载的时候就创建好对象链表及创建各个对象的指针, 通过传入类名来创建对象. 如果类很多的话可以把简单的链表改成Map吧..

热点排行