[英]c++ Why can't I pass up types CDC and CBitmap into another class's parameters?
我正在尝试将参数从一个类设置到另一个类。 但是对于CDC和CBitmap类型,它不会让我??
dcMem 和 m_bmp 是实例变量或类中的参数
(另请注意,我使用的是 vc++ 6.0)
error C2582: 'CDC' : 'operator =' function is unavailable
error C2582: 'CBitmap' : 'operator =' function is unavailable
.
Image::Set_dcMem(CDC _dcMem)
{
dcMem = _dcMem;
}
.
Image::Set_m_bmp(CBitmap _m_bmp)
{
m_bmp = _m_bmp;
}
我也尝试过从其他类设置参数,但得到了上面列出的相同错误:
Image *pImage = new Image;
pImage->dcMem = dcMem;
pImage->m_bmp = m_bmp;
我找到了这个链接,但不知道如何申请:
http://msdn.microsoft.com/en-us/library/ccb3dh5c%28v=vs.80%29.aspx
http://msdn.microsoft.com/en-us/library/aa983787%28v=vs.71%29.aspx
从下面进行更正:
CDC* dcMem;
CBitmap *m_bmp;
Image *pImage = new Image;
pImage->dcMem = &dcMem;
pImage->m_bmp = &m_bmp;
当您使用=
对象被复制时分配对象时,左侧的变量已经实例化,因此它必须以某种方式获取分配右侧对象状态的副本。
但有时很难复制一个对象。 在某些情况下是因为对象的某些内部数据成员无法复制,或者因为复制它们很困难或耗时。
在任何情况下,当类的作者决定副本不适用于该类时,他/她会取消定义operator=
方法,以防止该类的用户尝试分配该类的对象。 有关这方面的一些其他信息,请参阅此问题。
但这不是一个大问题。 通常,对于这种类型的对象,您无论如何都不想愉快地触发对象的副本。 相反,您要做的是使用引用和指针。
class Image {
CDC* dcMem; // <-- declare member variable as a reference
};
Image::Set_dcMem(CDC& _dcMem) // <-- pass references instead of objects
{
dcMem = &_dcMem; // <-- you can assign references just fine
}
您可以使用 WTL 实现来实现 GDI 对象上的包装器,因为它们是薄包装器。 然而,在 MFC 中,包装器并不是很“薄”,除了 GDI 对象句柄之外,它们还包括私有数据,并且不可复制。
您可以使用参考资料:
Image::Set_dcMem(CDC& _dcMem)
{
// ...
}
如果CDC
或CBitmap
具有引用数据成员、const 数据成员、私有/受保护运算符 = 或从此类类继承,则不能应用operator=
。
您不能复制CDC
或CBitmap
。 如果您查看头文件,您会看到CBitmap
派生自CGdiObject
,而CGdiObject
派生自CObject
。 CObject
声明了一个私有的operator=()
, CGdiObject
和CBitmap
没有声明一个operator=()
,所以编译器采用CObject::operator=()
,因为这是私有的,你不能复制CBitmap
。 (同样适用于CDC
但适用于其他基类。)
您应该更改Image
类以存储指向CDC
/ CBitmap
的引用或指针。 如果您可以将CDC
/ CBitmap
传递给Image
ctor,并且如果CDC
/ CBitmap
在Image
的生命周期内没有改变,我更喜欢存储参考。 如果您稍后需要在Image
的生命周期内设置或更改CDC
/ CBitmap
我会坚持存储指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.