error C2248: “CObject::CObject”: 無法訪問 private 成員(在“CObject”類中宣告)---解決辦法
如果自己定義了一個類,該類自身沒有過載賦值運算子(=)或者拷貝建構函式(把類物件作為引數直接傳入)都會造成此錯誤
在我們定義的Class中如果需要繼承,或者是必須繼承Object類時,我們又需要對類的物件進行操作是,會出現: error C2248: “CObject::CObject”: 無法訪問 private 成員(在“CObject”類中宣告)問題,這是由於微軟將Object類的操作運算子設定為private,在我們用到是需要這些操作符時,就需要我們自己來實現,來過載。
我在使用過程中遇到兩種問題,現在一一道來。
1、類物件進行賦值操作時。
如:
類CTest:
class CTest : public CObject
{
public:
CGridData(void);
virtual ~CGridData();
public:
int a;
……
}
CTest.cpp中使用:
CTest test1;
test1.a = 10;
CTest test2;
test2 = test1;//這裡就會出現上述錯誤:“CObject::CObject”: 無法訪問 private 成員
原因是我們沒有過載Object類的賦值運算子(=);
解決方法如下:類中新增
class CTest : public CObject
{
public:
CGridData(void);
virtual ~CGridData();
CTest & CTest::operator = (const CTest & RightSides)//新增運算子=
{
a = RightSides.a;
}
public:
int a;
……
}
2、例如我們使用CMap或者是Vector一些提供的模板庫包含類資料時,即使包含過載運算子=也會出現上述問題。
原因就是我們沒有新增拷貝建構函式,具體為什麼,我也不清楚,誰明白可以告訴我,不過這樣確實做確實能解決問題,已測試通過。
依然是上面的CTest類:
如果我們這樣使用:
CMap<CString, LPCTSTR, CTest, CTest> pCTestList; //出錯:“CObject::CObject”: 無法訪問 private 成員
或者是
struct TempData
{
CString str;
CTest pCTest;
}
Vector中使用到類資料:
vector<TempData> pTempDataList; //這裡是不會出錯的。但是
CTest test1;
test1.a = 123;
TempData temp;
temp.str = "RGB";
temp.pCTest = test1;
pTempDataList.push_back(temp); //這是就會出現錯誤;“CObject::CObject”: 無法訪問 private 成員
解決辦法如下:
class CTest : public CObject
{
public:
CGridData(void);
virtual ~CGridData();
CGridData(const CGridData & C)//新增拷貝建構函式
{
a = C.a;
}
CTest & CTest::operator = (const CTest & RightSides)//新增運算子=
{
a = RightSides.a;
}
public:
int a;
……
}
注意:拷貝建構函式一定要實現=運算子的功能,否則在CMap使用lookup時可以在雜湊表中查詢到資料,但是得到的的資料是空的。
---------------------
作者:程式碼搬運工007
來源:CSDN
原文:https://blog.csdn.net/bao_bei/article/details/46966067
版權宣告:本文為博主原創文章,轉載請附上博文連結!