2014-09-11 61 views
2

我有下面的類:如何使用「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

回答

0

隨着偏移假設你指字節偏移。

你可以試試這個解決方案:

(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