高分求解---如何枚举一个Class所有成员,并获得成员的类型及名称

xcs99321 2010-07-17 01:49:06
如何枚举一个Class所有成员,并获得成员的类型及名称

比如:

class
{
long t;
double x;
char m[12];
}A;

A a;

如何自动知道a的成员数目,类型,大小,成员名称,及赋值情况呢?

VC调试的时候,通常编译器能实现上述功能,输入一个变量,自动获取类型,及成员类型、名称。
...全文
272 点赞 收藏 21
写回复
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
xcs99321 2010-07-21
如何把自定义结构的数据存储到COleVariant中呢
struct ST
{
int a;
long b;
float c;
char* psz;
}
=>
ST A;
COleVariant m1(ST.a);
COleVariant m2(ST.b);
COleVariant m3(ST.c);
COleVariant m4(ST.psz);
COleSafeArray arr;
DWORD numElements[] = {4};
arr.Create(VT_VARIANT, 1, numElements);
long index = 0;
arr.PutElement(&index,m1);
index = 1;
arr.PutElement(&index,m2);
index = 2;
arr.PutElement(&index,m3);
index = 3;
arr.PutElement(&index,psz);

//将数组的值复给COleVariant对象
COleVariant var(arr.Detach());
回复
xcs99321 2010-07-21
有的另一个帖子有高手回复,有些智慧的火花,希望抛砖引玉,在这个帖子转一下
http://topic.csdn.net/u/20100721/20/b9008340-da3f-4045-958a-7622fc3401b4.html?seed=1752089830&r=67145918#r_67145918
回复
xcs99321 2010-07-21
由于工程进度问题,只能暂时考虑放弃学习CLI C++反射机制了,
自定义类管理自己定义的类型替代全功能型的了

class CGeneralType : public CObject
{
public:
CGeneralType();
virtual ~CGeneralType();
public:
char ItemName[64];
VARTYPE ItemType;
COleVariant ItemValue;
char ItemInfo[64];
char ItemTypeS[64];
void *ItemPoint;
public:

};

class CGTypeArrayManage : public CObject
{
public:
CGTypeArrayManage();
virtual ~CGTypeArrayManage();
public:
CArray<CGeneralType*,CGeneralType*> m_GTypeArray;

public:
BOOL ClearElement(BOOL DeleteMem=TRUE);
BOOL AddElement(CString ItemName,VARTYPE ItemType,COleVariant ItemValue,CString ItemInfo,void *ItemPoint);
BOOL AddElement(CString ItemName,COleVariant ItemValue,void *ItemPoint);
CGeneralType* GetAt(long index);
long GetSize();
CGeneralType* FindElement(CString ItemName);
};
具体使用:
CGTypeArrayManage m_TypeArray;
CString m1="sdfa";
long k=100;
double pi=3.14;
m_TypeArray.AddElement("m1",m1,(void*)&m1);
m_TypeArray.AddElement("k",k,(void*)&k);
m_TypeArray.AddElement("pi",pi,(void*)&pi);

回复
Dobzhansky 2010-07-20
学习 VCF 中...

库内建反射机制
回复
一名程序员 2010-07-20
楼主只能自己写一些接口、宏或类来实现了。参考CLI C++的反射实现原理。
回复
Eleven 2010-07-19
[Quote=引用 10 楼 xcs99321 的回复:]
我总感觉有一定的机制可以实现:
比如sizeof()就能知道类的大小;&a就能知道a的地址也就是第一个成员函数的地址,没有机制获得第N数据成员的指针呢,

还有sizeof()获得类的大小本身就很神奇,不知道实现机制是怎么样的,能不能从它实现机制中洞察到一些本主题解决方案呢,还望高手继续赐教。

对该主题深入讨论,谢谢!
[/Quote]
有个offsetof宏可以得到结构体成员距离结构体开始处的偏移量(字节为单位)
回复
xcs99321 2010-07-19
从C++类在内存中,数据成员与数据成员有没有分界没有标识机制呢,数据成员与成员函数在内存存储有区别吗?这些信息都是编译时期用的吗,运行期都退化成C语言内核了吗?

要是类在内存结构中有标识信息,本主题就有解,要是没有标识,本主题就没有解,不需要讨论了,

请高手明示。
回复
magic7004 2010-07-19
[Quote=引用 10 楼 xcs99321 的回复:]

我总感觉有一定的机制可以实现:
比如sizeof()就能知道类的大小;&a就能知道a的地址也就是第一个成员函数的地址,没有机制获得第N数据成员的指针呢,

还有sizeof()获得类的大小本身就很神奇,不知道实现机制是怎么样的,能不能从它实现机制中洞察到一些本主题解决方案呢,还望高手继续赐教。

对该主题深入讨论,谢谢!
[/Quote]

sizeof一点都不神奇,它只是一个运算符而已,而非一个函数。sizeof是编译时计算大小的,而不是运行时。
回复
teleinfor 2010-07-19
类A添加一个接口支持你的遍历吧,呵呵。不过这个A必须你自己写的。
回复
MoXiaoRab 2010-07-19
[Quote=引用 9 楼 xcs99321 的回复:]
看来只能自己维护一个自己定义的类具备这个特性了,也就仿RTTI机制。

不过jennyvenus这位大师提到"C++非托管里没有反射机制",也就是说C++托管里反射机制可以实现类似功能?

有没有进一步资料,我学习一下。
[/Quote]
你去搜索下:C# 反射。
在CLR C++里面同样适用
回复
Icedmilk 2010-07-19
[Quote=引用 10 楼 xcs99321 的回复:]
sizeof()获得类的大小本身就很神奇
[/Quote]

这个是编译期间就获得的吧,并不是运行时获得的

到了运行期,sizeof()就变成了具体的一个数。
回复
xcs99321 2010-07-19
我总感觉有一定的机制可以实现:
比如sizeof()就能知道类的大小;&a就能知道a的地址也就是第一个成员函数的地址,没有机制获得第N数据成员的指针呢,

还有sizeof()获得类的大小本身就很神奇,不知道实现机制是怎么样的,能不能从它实现机制中洞察到一些本主题解决方案呢,还望高手继续赐教。

对该主题深入讨论,谢谢!
回复
xcs99321 2010-07-19
看来只能自己维护一个自己定义的类具备这个特性了,也就仿RTTI机制。

不过jennyvenus这位大师提到"C++非托管里没有反射机制",也就是说C++托管里反射机制可以实现类似功能?

有没有进一步资料,我学习一下。
回复
hztj2005 2010-07-18
可能你得模仿RTTI,自己建一个结构,记录某个类的成员和函数了,并且给每个类添加一个static 变量,根据该变量判断各对象属于哪个类,然后找到相应的结构,自己遍历了。
回复
iqyely 2010-07-18
来关注下。
回复
副组长 2010-07-17
看来这个可是比不上COM接口了。
回复
Csuxiaowu 2010-07-17
学习 学习
回复
MoXiaoRab 2010-07-17
C++非托管里没有反射机制。
回复
jameshooo 2010-07-17
DEBUG版本会生成符号文件,所以调试时能看到所有变量和类成员。RELEASE版本虽然也能生成符号文件,但通常只能定位到代码行,变量值不再可靠,这是链接器优化后的结果,内存布局跟符号文件的描述不能匹配。
回复
Icedmilk 2010-07-17
编译之后就只有地址了。

调试的时候,内存里被填充了很多调试数据,你说的东西都是这些调试数据

Release的时候就没了
回复
发动态
发帖子
硬件/系统
创建于2007-09-28

2590

社区成员

VC/MFC 硬件/系统
申请成为版主
社区公告
暂无公告