1. 程式人生 > >error C2248: “CObject::CObject”: 無法訪問 private 成員(在“CObject”類中宣告)---解決辦法

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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!