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

C++ 反照

2013-01-07 
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之类的查表法。

[解决办法]


#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实现反射的简单例子。


#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吧..

热点排行