error C2248: “CObject::CObject”: 无法访问 private 成员(在“CObject”类中声明)

3 篇文章 0 订阅

原因

 

首先说明原因,这是由于对CObject对象进行直接拷贝导致的,在MFC中,大部分对象都是继承自​​CObject。然而,​​CObject对象没有实现拷贝构造函数和拷贝赋值运算符,如下图所示。

 

 如下例所示:

CStatic m_static1;
m_static1.Create(NULL,NULL,_T("文本"),WS_VISIBLE,CRect(0,0,100,100),this,IDC_M_STATIC1);
vector<CStatic> v_static;
v_static.push_back(m_static1);//报错行

CObject

        CCmdTarget

                CWnd

                        CStatic

                        CButton

通过上述继承关系可知CStatic是继承自CObject类的。

这里通过Vector来直接存储CStatic对象,在pushback的时候会发生对象的拷贝,从而引发上述问题。
同样,对于相同类型的拷贝赋值也会引发这个问题。如下例所示:

CStatic m_static2=m_static1;

总之凡是涉及拷贝构造和拷贝赋值的所有过程都会引发此问题。

解决方法:

1.CObject对象的该问题

(1)通过指针解决。

CStatic * p_static1=new CStatic;
p_static1->Create(NULL,NULL,_T("文本"),WS_VISIBLE,CRect(0,0,100,100),this,IDC_M_STATIC1);
vector<CStatic*> v_static;
v_static.push_back(p_static1);

这就可以避免直接拷贝,从而解决问题。

(2)自定义类并继承CObject对象的类,同时在自定义类中添加特殊成员,从而添加自定义类的拷贝构造函数和拷贝赋值运算符。

.h
class CStatic_Me : public CStatic
{
	DECLARE_DYNAMIC(CStatic_Me)

public:
	int a;
	CStatic_Me();
	virtual ~CStatic_Me();
	CStatic_Me(const CStatic_Me& C);

	CStatic_Me & operator =(const CStatic_Me & C);

};
.cpp
CStatic_Me::CStatic_Me():a(0)
{
}

CStatic_Me::~CStatic_Me()
{
}
CStatic_Me::CStatic_Me(const CStatic_Me& C)
{
	a=C.a;
}
CStatic_Me & CStatic_Me::operator =(const CStatic_Me &C)
{
	a=C.a;
	return *this;
}

 2.对于自定义的对象

通过添加拷贝构造函数和拷贝赋值运算符,或者使用指针均可解决问题。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值