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