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;
}
#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;
}