在我们定义的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
版权声明:本文为博主原创文章,转载请附上博文链接!