如何使用“COUT”打印数据成员的地址(类偏移)

问题描述:

我有下面的类:如何使用“COUT”打印数据成员的地址(类偏移)

class A 
{ 
public: 
    double a; 
    float b; 
    double c; 
}; 

我要打印数据成员在课堂上的偏移,比我用:

double A::* pm = &A::a; 
cout << *(int *)&pm << endl; 

它运作良好,并打印“0”,但我不希望使用中间变量pm

cout << *(int *)&A::a << endl; 

我编译错误机智H:无效类型转换

+1

你应该澄清你的问题,因为您要打印的是不是一个偏移,偏移量应该是成员地址和类之间的区别实例地址,正如@WhozCraig'std :: offsetof'所提到的那样。 – 2014-09-11 08:30:59

+0

@RudolfsBundulis:这可能是薄片状的,非可移植的方式来打印件的偏移,如果这是构件指针如何表示(这是通常的情况),并且如果成员指针恰巧有大小为'int'相同。但是,是的,'std :: offsetof'是获得偏移量的便携方式。 – 2014-09-11 08:40:50

+1

@WhozCraig我不相信'的std :: offsetof'存在。这是一个宏,它不驻留在'std'中。 – 2014-09-11 08:55:03

随着偏移假设你指字节偏移。

你可以试试这个解决方案:

(size_t) &(((A*)0)->a) // prints 0 

其实这是宏观offsetof作为WhozCraig建议的执行情况。

... 
cout << "A::a => " << (size_t) &(((A*)0)->a) 
    << "\nA::b => " << (size_t) &(((A*)0)->b) 
    << "\nA::c => " << (size_t) &(((A*)0)->c); 
... 

与您的数据相结合,前面的代码将打印:

A::a => 0 
A::b => 8 
A::c => 16