2011-09-26 19 views
1

如您所知,編譯器定義了默認構造函數,如果未手動定義POD結構,請複製構造函數,賦值運算符和析構函數。通常(或者我應該總是說)這是一個複製操作。所以我決定從Win結構體BITMAP中繼承我的類,以便在構造函數中提供內存分配並在析構函數中解放。我沒有使用組合'因爲我想允許使用它與一些WinAPI函數。下面是一些代碼片段:在從POD繼承的類中定義複製構造函數struct

class CPreviewFrame : public BITMAP 
{ 
public: 
    CPreviewFrame(); 
    CPreviewFrame(std::size_t width, std::size_t height, UCHAR bytesPerPixel = 3); 
    CPreviewFrame(const CPreviewFrame& frame); 

    ~CPreviewFrame(); 
    ..... 
}; 

並且拷貝構造函數定義類似的東西:

CPreviewFrame::CPreviewFrame(const CPreviewFrame& frame): 
    BITMAP(static_cast<BITMAP>(frame)), //question is here 
    m_bufferSize(frame.m_bufferSize) 
{ 
    bmBits = new uint8_t[ m_bufferSize ]; 
    memcpy(bmBits, frame.bmBits, m_bufferSize); 
} 

所以我的問題是:是否有從繼承結構或致電編譯器定義的複製構造有道我應該在構造函數體中手動複製所有字段嗎?這兩個變體對我來說都有點奇怪,因爲儘管編譯器定義了它們,POD結構仍然不能有構造函數。如果POD數據類型不存在定義,如何調用POD數據類型的構造函數?

P.S.上面提到的代碼在VS2010上編譯得很好。

P.P.S.這個主題有相關的問題由我發佈here

回答

4

BITMAP(frame)將執行該操作,不需要強制轉換,因爲編譯器將知道父類型並能夠隱式轉換參數。請注意,如果您想使用演員陣列來明確顯示您正在做什麼,請將其投射爲參考類型:BITMAP(static_cast<const BITMAP&>(frame)),

另外,請認真考慮此繼承。從現在開始,有一兩年時間有人會將您的CPreviewFrame個對象中的一個作爲BITMAP刪除。最好的情況下,他們泄漏內存,最壞的情況下,你花了幾天或幾周來調試爲什麼該應用程序不正常。組合(帶有一個適當的接口,可以調用場景後面的WinAPI函數)通常不是很複雜的實現,它會更準確,更準確地模擬你的問題。

或者,你可以使用組合,只是提供一個getter的位圖部分(如評論建議)。這暴露了您的類的實現細節,但可能會更容易在短期內對Win API進行編碼。

+0

我想在顯式轉換爲引用類型的情況下,需要避免創建臨時變量?這是有用的評論,我會牢記在心。至於刪除它肯定會導致問題,我沒有注意到。但是提供這種功能並保持與WinAPI兼容性的更好方法是什麼? (至於功能 - 它不會僅限於內存的東西。從預覽幀的角度來看,可以有其他擴展)。也許通過提供getter來引用BITMAP甚至轉換運算符? –