如何枚举一个Class所有成员,并获得成员的类型及名称比如:
  
class 
{
  long t;
  double x;
  char m[12];
}A;A a;如何自动知道a的成员数目,类型,大小,成员名称,及赋值情况呢?VC调试的时候,通常编译器能实现上述功能,输入一个变量,自动获取类型,及成员类型、名称。

解决方案 »

  1.   

    编译之后就只有地址了。调试的时候,内存里被填充了很多调试数据,你说的东西都是这些调试数据Release的时候就没了
      

  2.   

    DEBUG版本会生成符号文件,所以调试时能看到所有变量和类成员。RELEASE版本虽然也能生成符号文件,但通常只能定位到代码行,变量值不再可靠,这是链接器优化后的结果,内存布局跟符号文件的描述不能匹配。
      

  3.   

    看来这个可是比不上COM接口了。
      

  4.   

    可能你得模仿RTTI,自己建一个结构,记录某个类的成员和函数了,并且给每个类添加一个static 变量,根据该变量判断各对象属于哪个类,然后找到相应的结构,自己遍历了。
      

  5.   

    看来只能自己维护一个自己定义的类具备这个特性了,也就仿RTTI机制。不过jennyvenus这位大师提到"C++非托管里没有反射机制",也就是说C++托管里反射机制可以实现类似功能?有没有进一步资料,我学习一下。
      

  6.   

    我总感觉有一定的机制可以实现:
    比如sizeof()就能知道类的大小;&a就能知道a的地址也就是第一个成员函数的地址,没有机制获得第N数据成员的指针呢,还有sizeof()获得类的大小本身就很神奇,不知道实现机制是怎么样的,能不能从它实现机制中洞察到一些本主题解决方案呢,还望高手继续赐教。对该主题深入讨论,谢谢!
      

  7.   


    这个是编译期间就获得的吧,并不是运行时获得的到了运行期,sizeof()就变成了具体的一个数。
      

  8.   

    你去搜索下:C# 反射。
    在CLR C++里面同样适用
      

  9.   


    sizeof一点都不神奇,它只是一个运算符而已,而非一个函数。sizeof是编译时计算大小的,而不是运行时。
      

  10.   

    有个offsetof宏可以得到结构体成员距离结构体开始处的偏移量(字节为单位)
      

  11.   

    楼主只能自己写一些接口、宏或类来实现了。参考CLI C++的反射实现原理。
      

  12.   

    学习 VCF 中...库内建反射机制
      

  13.   

    由于工程进度问题,只能暂时考虑放弃学习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);
      

  14.   

    有的另一个帖子有高手回复,有些智慧的火花,希望抛砖引玉,在这个帖子转一下
    http://topic.csdn.net/u/20100721/20/b9008340-da3f-4045-958a-7622fc3401b4.html?seed=1752089830&r=67145918#r_67145918
      

  15.   

    如何把自定义结构的数据存储到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());