视觉 c++ 为什么我不能将 CDC 和 CBitmap 类型传递到另一个类的参数中?
visual 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
}
可以使用 GDI 对象包装器的 WTL 实现来执行此操作,因为这些对象是精简包装器。在 MFC howevre 中,包装器不是很"薄",除了 GDI 对象句柄之外,它们还包括私有数据,并且不可复制。
不过,您可以使用引用:
Image::Set_dcMem(CDC& _dcMem)
{
// ...
}
如果CDC
或CBitmap
具有引用数据成员、常量数据成员、私有/受保护运算符 = 或从此类继承,则不能应用 operator=
。
您无法复制CDC
或CBitmap
。如果您查看头文件,您会发现CBitmap
派生自CGdiObject
派生自CObject
。 CObject
声明了一个私有operator=()
,CGdiObject
和CBitmap
不声明operator=()
,所以编译器采用CObject::operator=()
,因为这个是私有的,所以你不能复制CBitmap
。(这同样适用于CDC
但也适用于其他基类。
您应该更改Image
类以存储引用或指向CDC
/CBitmap
的指针。如果您可以将CDC
/CBitmap
传递给Image
ctor,并且CDC
/CBitmap
在Image
的生命周期内没有变化,我更喜欢存储引用。如果你需要在Image
的生命周期内设置或更改CDC
/CBitmap
,我会坚持存储指针。
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 如果需要转换,我可以在读取参数的同时将其移动到另一个参数吗?
- 如何在另一个函数中使用返回值作为参数?
- 如果模板参数是另一个模板的实例化,则键入特征测试
- 如何使用另一个类中的公共成员函数作为参数调用线程
- 如何将 lambda 函数作为参数发送到另一个函数
- 如何设置默认参数以防用户不输入另一个参数
- 将另一个参数传递给函子的库
- 一个C++默认参数可以用另一个参数初始化吗
- 从另一个参数引用的模板可变参数
- 如何根据c++中getopt中另一个参数的存在来解析其他参数
- 如何让每个线程传递另一个参数
- 从另一个参数的值设置默认参数值
- 使用参数的 getter 之一在 C++ 函数中设置另一个参数的值?
- Qt:用另一个参数创建一个新类
- 谷歌模拟,使用另一个参数的参数匹配器
- 非类型模板参数,其类型依赖于另一个参数