2013-04-08 66 views
1

我是MFC編程的新手。現在我正在使用Jeff Prosise的書來學習MFC編程。我遇到了:CClientDC dc (this);,我從CClientDC類的定義中找到了一個構造函數:CClientDC(CWnd* pWnd);,但是如果我將CClientDC dc (this);替換爲CClientDC dc = CClientDC(this);。編譯器告訴我這是一個錯誤。我無法理解它。我認爲CClientDC dc (this);CClientDC dc = CClientDC(this);是一樣的。換句話說,前者是一種簡單的形式。爲什麼`CClientDC dc(this);`不能被`CClientDC dc = CClientDC(this)'替換;`

非常感謝。

回答

7
CClientDC dc = CClientDC(this); 

相當於

CClientDC dc(CClientDC(this)); 

爲此,CClientDC必須有一個複製或移動的構造,因爲你基本上是通過從臨時對象拷貝構造dc

如果初始化是複製初始化,其中源類型的cv不合格版本與目的地是相同的類,則考慮構造函數。 [...]調用如此選擇的構造函數來初始化對象,初始化器表達式或表達式列表作爲它的參數。如果不應用構造函數,或者重載解析模糊不清,則初始化不合格。

1

拷貝構造函數和重載賦值運算符的CObject(基類CClientDC和CDC)的明確標記爲私有afx.h

private: 
    CObject(const CObject& objectSrc);    // no implementation 
    void operator=(const CObject& objectSrc);  // no implementation 

這是明確的,因爲許多成員完成(如HDC成員)在DC對象(以及其他基於CObject的類)中需要多次引用的顯式處理。否則,一個實例的析構函數可能會「關閉」底層句柄。從而使另一個實例處於不確定(壞)狀態。

+0

這並沒有真正回答這個問題,OP沒有試圖複製'CClientDC'對象。 sftrabbit的答案解釋了爲什麼代碼並不意味着OP認爲它的作用。 – hvd 2013-04-08 09:57:51

0

爲了成功執行CClientDC dc = CClientDC(this),需要一個CClientDC的重載構造函數,它將cwind *作爲參數並返回CClientDC。 但它不存在。所以編譯器給出了錯誤。

+0

該構造函數確實存在,並且在問題中明確提到。 – hvd 2013-04-08 09:58:34

相關問題