“CObject:CObject”: 无法访问 private 成员(在“CObject”类中声明)解决思路

“CObject::CObject”: 无法访问 private 成员(在“CObject”类中声明)
编译环境:vc2010、mfc单文档应用程序
问题:将一个结构体变量压入vector出错

具体:
1. 定义结构体:
typedef struct LineTooltip
{
CRgn rgn_line; // CRgn区域的线
CString sBeginElementID; // 线对应的起始元素ID
CString sEndElementID; // 线对应的截止元素ID
} LineTooltip;

2. 头文件中定义vector:
vector<LineTooltip> vLineTooltip;

3. 实现文件中将结构体变量压入vector:
CPoint point1(0, 0);
CPoint point2(0, 2);
CPoint point3(100, 2);
CPoint point4(100, 0);

CPoint pointLine[4] = {point1, point2, point3, point4};

LineTooltip tempLineTooltip;
tempLineTooltip.rgn_line.CreatePolygonRgn(pointLine, 4, WINDING);
tempLineTooltip.sBeginElementID = L"";
tempLineTooltip.sEndElementID = L"";
vLineTooltip.push_back(tempLineTooltip); // 运行到此句出错

4. 提示错误:
1>c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afxwin.h(362): error C2248: “CObject::CObject”: 无法访问 private 成员(在“CObject”类中声明)
1>          c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(534) : 参见“CObject::CObject”的声明
1>          c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(509) : 参见“CObject”的声明
1>          此诊断出现在编译器生成的函数“CGdiObject::CGdiObject(const CGdiObject &)”中
------解决方案--------------------
class CRgn : public CGdiObject,class CGdiObject : public CObject
 在MFC里,CObject的拷贝构造为私有,所以凡是从CObject派生的类,都不能通过拷贝构造来创建新实例,这样做是为了防止浅拷贝,如果要传递一个参数,一般传引用或者指针。
楼主要自己实现LineTooltip的拷贝构造,CRgn可用指针。

------解决方案--------------------
需要重载一个赋值操作符才可以实现
------解决方案--------------------
今天在写程序的过程中编译时出现一个错误,错误描述如下:
error C2248: “CObject::CObject”: 无法访问 private 成员(在“CObject”类中声明)
1>d:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afx.h(551) : 参见“CObject::CObject”的声明
1>d:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afx.h(522) : 参见“CObject”的声明
点击之后,并不能到真正出错的代码之中,经过对修改过的代码按照排除法进行分析,发现是一个结构体的赋值语句出问题:
typedef struct tagExportBlock

     CLargeImage iExportedImage;
     tagLargeImagePar tagImagePar;
         CLargeImage* iSourceImage;
     long lStartX, lEndX, lStartY, lEndY;
         double dPrecision;
         long lID;
         bool bExported;  //是否完成
}EXPORTEDBLOCK;
tagExportBlock tagBlock = m_vExportBlocks[lThreadID];     //(1)
m_vExportBlocks.push_back(tagBlock);         //(2)
初步分析由于结构体中的CLargeImage iExportedImage;该成员无法直接用=号赋值,因此需要在结构体中增加一个重载赋值操作符的函数,或者更改赋值语句,我采用如下语句:
将 
tagExportBlock tagBlock = m_vExportBlocks[lThreadID];
改为 
tagExportBlock& tagBlock = m_vExportBlocks[lThreadID];
(1)即可通过编译,如此的话,并没有新增一个tagExportBlock对象,而是增加一个指向m_vExportBlocks[lThreadID]的指针,修改tagBlock的时候也就同时修改m_vExportBlocks[lThreadID],正好适用我现在的情况。
但是(2)的话,修改只能需要重载一个赋值操作符才可以实现。

------解决方案--------------------
但是(2)的话,修改只能需要重载一个赋值操作符才可以实现
---------------------------------------------
放入vector的类一定要支持赋值和复制操作,仅此而已