2009-07-28 29 views
0

我有一個類層次結構,我知道給定的類(B)總是會被派生到第二個類(D)中。在B的構造函數中,如果我確信在整個構造完成之前沒有人會嘗試使用它,將this指針靜態轉換爲D *是安全的嗎?在我的情況下,我想將對象的引用傳遞給另一個類(A)。施工期間是否向下傾斜?

struct A 
{ 
    D & d_; 

    A(D & d) : d_(d) {} 
}; 

struct D; //forward declaration 

struct B 
{ 
    A a; 

    B() : a(std::static_cast<D&>(*this)) {} 
}; 

struct D : public B 
{}; 

此代碼是否安全?

+0

這就提出了一個什麼樣的價值類d是增加的問題,如果B *總是*一D. ​​ – JohnMcG 2009-07-28 13:42:58

+0

B是定義一個類模板或不基於它的模板參數的成員函數。有幾個這樣的類模板,然後由D繼承以提供依賴於模板參數的接口。 – 2009-07-29 06:54:58

回答

0

@AProgrammer's answer讓我意識到static_cast可以通過將this指針從派生類傳遞到基類很容易避免。因此,這個問題歸結爲指向member-initializer-list的this指針的有效性。

我發現下面的註釋在C++標準[12.6.2.7]:

[注:因爲MEM-初始化在構造的範圍進行評估,所述this指針可以用在mem初始化程序表達式列表中以引用正被初始化的對象。 ]

因此,在構件-初始化列表使用this是完全有效的,所以我認爲呈現的代碼是安全的(只要不d的成員進行訪問)。

2

不,它不是。 D的數據成員的構造函數尚未運行。

由於D的membrs沒有構造,d沒有完全構造還,所以在技術上,以d參考應該是無效的。我希望在大多數實現中不成問題,但仍然如此。

我想建議一個更好的機制,但我想「更好」取決於實際的細節。

+0

我知道D還沒有建成,這就是爲什麼我要在施工結束之前沒有訪問其成員的原因。 – 2009-07-28 11:51:38

2

我沒有找到任何有關這方面的信息。我有麻煩找到你的代碼將是不安全的原因,而這是安全的:

struct B 
{ 
    A a; 

    B(D& d) : a(d) {} 
}; 

struct D : public B 
{ 
    D() : B(*this) {} 
}; 

,但我很可能仍然使用我這裏介紹的形式。