如何使用“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:无效类型转换
答
随着偏移假设你指字节偏移。
你可以试试这个解决方案:
(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
你应该澄清你的问题,因为您要打印的是不是一个偏移,偏移量应该是成员地址和类之间的区别实例地址,正如@WhozCraig'std :: offsetof'所提到的那样。 – 2014-09-11 08:30:59
@RudolfsBundulis:这可能是薄片状的,非可移植的方式来打印件的偏移,如果这是构件指针如何表示(这是通常的情况),并且如果成员指针恰巧有大小为'int'相同。但是,是的,'std :: offsetof'是获得偏移量的便携方式。 – 2014-09-11 08:40:50
@WhozCraig我不相信'的std :: offsetof'存在。这是一个宏,它不驻留在'std'中。 – 2014-09-11 08:55:03