c ++为什么我不能将类型CDC和CBitmap传递给另一个类的参数?

时间:2011-11-30 06:41:13

标签: c++ visual-c++ mfc

我正在尝试将参数从一个类设置为另一个类。 但对于类型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;

4 个答案:

答案 0 :(得分:2)

使用=分配对象时,对象被复制,左侧的变量已经实例化,因此它必须以某种方式获取赋值右侧对象状态的副本。 / p>

但有时复制对象很困难。在某些情况下,这是因为无法复制对象的某些内部数据成员,或者因为复制它们很困难或耗时。

在任何情况下,当一个类的作者决定副本不适用于该类时,他/她取消定义operator=方法,以防止该类的用户尝试分配该类的对象。有关此问题的更多信息,请参阅this question

但这不是一个大问题。通常情况下,对于这类对象,您无论如何都不想愉快地触发对象的副本。相反,你想要做的是使用引用和指针。

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
}

答案 1 :(得分:1)

你可以使用WTL实现来实现GDI对象的包装,因为它们是瘦包装器。在MFC中,包装器并不是很“薄”,除了GDI对象句柄外,它们还包含私有数据,并且不可复制。

您可以使用参考:

Image::Set_dcMem(CDC& _dcMem)
{
  // ...
}

答案 2 :(得分:0)

如果CDCCBitmap具有引用数据成员,const数据成员,private / protected operator =,或者从这些类继承,则无法应用operator=。< / p>

答案 3 :(得分:0)

您无法复制CDC或CBitmap。如果查看头文件,您会看到CBitmap派生自CGdiObject,派生自CObject。 CObject声明一个私有的运算符=(),CGdiObject和CBitmap没有声明一个operator =(),所以编译器接受CObject :: operator =(),因为这个是私有的,你不能复制一个CBitmap。 (同样适用于CDC但具有其他基类。)

您应该更改Image类以存储引用或指向CDC / CBitmap的指针。如果你可以将CDC / CBitmap传递给Image ctor并且CDC / CBitmap没有改变Image的生命周期,我更喜欢存储引用。如果您需要稍后在图像的生命周期内设置或更改CDC / CBitmap,我会坚持存储指针。