C++ c++;为什么可以';我将CDC和CBitmap类型传递到另一个类';s参数?

C++ c++;为什么可以';我将CDC和CBitmap类型传递到另一个类';s参数?,c++,visual-c++,mfc,C++,Visual C++,Mfc,我正在尝试将参数从一个类设置为另一个类。 但是对于CDC和CBitmap类型,它不允许我 dcMem和m_bmp是实例变量或类中的参数 (还要注意,我使用的是vc++6.0) 我也尝试过从另一个类中设置参数,但得到了上面列出的相同错误: Image *pImage = new Image; pImage->dcMem = dcMem; pImage->m_bmp = m_bmp; 我找到了以下链接,但不确定如何应用: 通过下面的更正: CDC* dcMem; CBitmap

我正在尝试将参数从一个类设置为另一个类。 但是对于CDC和CBitmap类型,它不允许我

dcMem和m_bmp是实例变量或类中的参数

(还要注意,我使用的是vc++6.0)

我也尝试过从另一个类中设置参数,但得到了上面列出的相同错误:

Image *pImage = new Image;
pImage->dcMem = dcMem;
pImage->m_bmp = m_bmp;
我找到了以下链接,但不确定如何应用:

通过下面的更正:

CDC* dcMem;
CBitmap *m_bmp;

Image *pImage = new Image;
pImage->dcMem = &dcMem;
pImage->m_bmp = &m_bmp;

如果
CDC
CBitmap
具有引用数据成员、const数据成员、private/protected operator=,或从此类类继承,那么您不能应用
operator=

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

您可以使用以下引用:

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

您不能复制
CDC
CBitmap
。如果查看头文件,您将看到
CBitmap
派生自
CGdiObject
,后者派生自
CObject
CObject
声明一个私有的
operator=()
CgdObject
CBitmap
不声明一个
操作符=()
,因此编译器采用
CObject::operator=()
,因为这个操作符是私有的,所以不能复制
CBitmap
。(这同样适用于
CDC
,但也适用于其他基类。)


您应该更改
Image
类以存储指向
CDC
/
CBitmap
的引用或指针。如果您可以将
CDC
/
CBitmap
传递到
Image
ctor,并且
CDC
/
CBitmap
Image
的生命周期内没有变化,我更愿意存储一个引用。如果您需要在
Image
的生命周期内设置或更改
CDC
/
CBitmap
,我会坚持存储指针。

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

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

在任何情况下,当类的作者决定副本不适用于该类时,他/她会取消定义
操作符=
方法,以防止该类的用户尝试分配该类的对象。有关这方面的更多信息,请参阅

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

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
}
类图像{

CDC*dcMem;//不工作..我是否需要执行以下操作:void operator=(const B&B){}作为参数/参数工作,不能继续工作,因为您还需要检查类代码。抱歉,犯了一个小错误。我忘记将dcMem成员切换到指针。它现在应该可以工作了。
CDC* dcMem;
CBitmap *m_bmp;

Image *pImage = new Image;
pImage->dcMem = &dcMem;
pImage->m_bmp = &m_bmp;
Image::Set_dcMem(CDC& _dcMem)
{
  // ...
}
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
}