[英]Strange behavior of default constructor in a class inherited from POD struct
[英]Defining copy constructor in a class inherited from POD struct
如您所知,如果不是手動定義,編譯器會為 POD 結構定義默認構造函數、復制構造函數、賦值運算符和析構函數。 通常(或者我應該說總是)這是一個有點復制操作。 所以我決定從 Win 結構 BITMAP 繼承我的類,以在構造函數中提供內存分配並在析構函數中釋放。 我沒有使用組合,因為我想允許將它與某些 WinAPI 函數一起使用。 這是一段代碼:
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 數據類型,如何調用它的構造函數?
上面提到的 PS 代碼在 VS2010 上編譯得很好。
PPS 我在這里發布了與此主題相關的問題。
BITMAP(frame)
將無需BITMAP(frame)
完成此操作,因為編譯器將知道父級的類型並能夠隱式轉換參數。 請注意,如果您想使用BITMAP( static_cast<const BITMAP&>(frame) ),
來顯式顯示您在做什么,請BITMAP( static_cast<const BITMAP&>(frame) ),
為引用類型: BITMAP( static_cast<const BITMAP&>(frame) ),
另外,請認真考慮這種繼承。 一兩年后的某個時候,有人會刪除您的一個CPreviewFrame
對象作為BITMAP
。 最好的情況是它們會泄漏內存,最壞的情況是您需要花費數天或數周的時間來調試應用程序無法正常工作的原因。 組合(具有可以在幕后調用 WinAPI 函數的適當接口)通常實施起來並不復雜,它會在此處更准確和正確地對您的問題進行建模。
或者,您可以使用組合並只為位圖部分提供一個 getter(如評論中所建議)。 這會公開您的類的實現細節,但可能會在短期內更輕松地對 Win API 進行編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.