1.問題提出
類中包含clist模板類,且clist的元素是派生自cobject的自定義類時;編譯器報錯資訊「
error c2248
:「cobject::operator=
」無法訪問
private
成員(在「
cobject
」類中宣告)」
2.問題分析
原因是與c++類的「複製建構函式」與「複製操作符」有關。對於乙個c++類來說,需要指定建立、複製、賦值和撤銷該型別的物件時會發生什麼?這是通過定義特殊的成員函式-建構函式、複製建構函式、賦值操作符和析構函式來實現的。如果類沒有顯式定義這些函式,則會使用預設函式。通過mfc產生的派生自cobject類或其派生類的自定義類,嚮導都會自動產生建構函式和析構函式,因此大家對這兩個函式是比較熟悉的。而另外兩個特殊函式複製建構函式和複製操作符則沒有自動生成,如果在類中沒有顯式定義這兩個函式,則類會使用預設複製建構函式和預設賦值操作符。
預設賦值操作符的功能是對類的所有非靜態成員變數進行賦值處理。對於類b,如果沒有顯式的定義其賦值操作符,則類會使用預設的賦值操作符,對clist型別的b進行賦值,此時會呼叫型別a的賦值操作符,而類a也沒有定義複製操作符,因此會呼叫其父類的賦值操作符,直到呼叫cobject類的賦值操作符「=」;而cobject類的賦值操作符的訪問許可權是private,因此編譯器報錯。
3.問題解決
解決該問題的方法如圖中紅色部分所示,類a過載賦值操作符,並且將其訪問許可權設定為public,則類b的預設賦值操作符將會呼叫類a的過載賦值操作符,而不再去呼叫類a的預設賦值操作符。
解決方法:在自定義類中過載「=」操作符,並且將其宣告為public,即可。
class a:public cobject
int x;
a& operator=(const a& a)
return *this;
class b
clistb;
4.問題思考
4.1 類b過載賦值操作符,類a是否就可以不用過載賦值操作符了?
當類b過載了賦值操作符,在該操作符中也要對類b的成員變數包含a的clist變數進行賦值,還是需要呼叫類a的賦值操作符,因此此時類a還是要過載操作符。
4.2 類a要過載賦值操作符,為什麼不用過載複製建構函式?
類b的預設複製建構函式此時會呼叫類a的預設複製建構函式,最後呼叫cobject的建構函式,而cobject的建構函式訪問許可權是public,可以訪問。所以不需要過載複製建構函式。
4.3 如果類a本身就是基類而沒有父類,那麼a是否還需要過載複製操作符?
從圖中可以看到,如果類a本身就是基類,則類b的預設賦值操作符會呼叫類a的預設賦值操作符,此時流程到此終止,不會向下進行。
VS2008編譯問題!
vs2005鏈結問題 lnk2005錯誤 error lnk2005 free 已經在 libcmtd.lib dbgheap.obj 中定義 以前經常遇到這個警告資訊,因為執行並沒有什麼問題,所以也沒深究。但是耿耿於懷那個 0 個錯誤,0 個警告 的成功提示,在網上搜了一下。原來問題出在預設庫的引...
vs2008 編譯驅動
一 c c 屬性設定 1.新增包含檔案 wdk inc crt wdk inc api wdk inc ddk 2.設定目標平台 preprocessor x86 3.修改呼叫約定為 stdcall gz 4.執行時庫選擇 多執行緒除錯 mtd 或者多執行緒 mt 基本執行時檢查 預設值 二 lin...
VS2008編譯問題
將之前版本的程式拿來用vs2008重新編譯發現好多編譯問題,比如 1 提示 fatal error c1083 cannot open include file mclmcrrt.h no such file or directory 試試 該vs2008的程式使用的matlab的庫,預設的vs d...