我定义了一个全局函数,参数有个CBrush类的,为什么必须用指针或者引用才能生效

walfud 2009-08-24 11:20:31
我的函数是
void ChangeBackColor(
int BitmapID,
CBrush &m_backpaper //这里要是不加引用就会出错,为什么呢?
)
{
CBitmap bitmap ;
bitmap.LoadBitmap(BitmapID) ;
m_backpaper.CreatePatternBrush(&bitmap) ;
}
......
在OnInitDialog中有如下调用
....
CBrush m_wallpaper ;
ChangeBackColor(IDB_PICTURE,m_wallpaper) //IDB_PICTURE是已经导入好的bmp图片
...全文
180 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ok1234567 2009-08-25
  • 打赏
  • 举报
回复
是的,完全可以!
周成风 2009-08-25
  • 打赏
  • 举报
回复
這話很明顯,沒有拷貝構造函數。。

傳指針或是引用吧!
arong1234 2009-08-25
  • 打赏
  • 举报
回复
更严重的问题在于:你上面说的引文部分的话显然是不合情理的!!如果你不关心传进去什么,那么你干什么需要传它进去?
[Quote=引用 3 楼 walfud 的回复:]
引用 2 楼 xylicon 的回复:

如果我只是希望执行他的函数,那与是不是传进去的对象没有关系啊。我很奇怪这样写为什么会报错?
[/Quote]
MoXiaoRab 2009-08-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xylicon 的回复:]
引用 8 楼 walfud 的回复:
我用的中文版,它说error C2664: 'ChangeBackColor' : cannot convert parameter 2 from 'class CBrush' to 'class CBrush'
        No copy constructor available for class 'CBrush'


那就对了,因为CBrush没有拷贝构造函数,而你传非引用并且非指针的参数,会先调用拷贝构造函数构造一个临时变量的,但因为CBrush没有拷贝构造函数,所以这里就报错了。

而传引用或者指针就不需要调用拷贝构造函数构造一个临时变量。所以也就会编译通过。
[/Quote]
呵呵。对的,因为构造函数的原因
walfud 2009-08-25
  • 打赏
  • 举报
回复
多谢各位前辈,小弟再多句嘴,如果我给原来的类加了拷贝构造函数,那是不是就能通过编译,并且可以执行其相应函数了?虽然理论上说不过去,但是应该可以把?
lizmei001 2009-08-25
  • 打赏
  • 举报
回复
函数的定义就是指针,传对象怎么行呢
多看看基础方面的
ok1234567 2009-08-25
  • 打赏
  • 举报
回复
许多MFC的类没有实现操作符“=”,因此你只能以地址的方式传送对象本身,而不是它的副本
walfud 2009-08-25
  • 打赏
  • 举报
回复
多谢各位!晚辈虚心接受。今此结帖,祝各位高人身体健康,万事如意!
xylicon 2009-08-24
  • 打赏
  • 举报
回复
如果你传的参数不是引用或者不是指针,那么函数会帮你的参数创建一个临时对象,当函数结束的时候,函数会释放该临时对象。

所以你m_backpaper.CreatePatternBrush(&bitmap) ; 这个句话于你传进去的实参m_wallpaper是没有任何作用的。

lz,引用与指针,这是C++的基础啊。
pasdtniuren 2009-08-24
  • 打赏
  • 举报
回复
参数类型原因吧
xylicon 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 walfud 的回复:]
我用的中文版,它说error C2664: 'ChangeBackColor' : cannot convert parameter 2 from 'class CBrush' to 'class CBrush'
        No copy constructor available for class 'CBrush'
[/Quote]

那就对了,因为CBrush没有拷贝构造函数,而你传非引用并且非指针的参数,会先调用拷贝构造函数构造一个临时变量的,但因为CBrush没有拷贝构造函数,所以这里就报错了。

而传引用或者指针就不需要调用拷贝构造函数构造一个临时变量。所以也就会编译通过。
walfud 2009-08-24
  • 打赏
  • 举报
回复
我用的中文版,它说error C2664: 'ChangeBackColor' : cannot convert parameter 2 from 'class CBrush' to 'class CBrush'
No copy constructor available for class 'CBrush'
whw_good 2009-08-24
  • 打赏
  • 举报
回复
因为传引用或指针,其实传的是bitmap的地址,而不像传值那样去构建临时对象(临时对象在离开该函数时会自动释放其内存)。 建议楼主去看下《编程思想》。
xylicon 2009-08-24
  • 打赏
  • 举报
回复
编译链接报的什么错?
walfud 2009-08-24
  • 打赏
  • 举报
回复
哦,前辈指点的是。不过如果我觉得至少编译链接不应该报错吧,虽然执行上肯定有问题。这是怎么回事
xylicon 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 walfud 的回复:]
如果我只是希望执行他的函数,那与是不是传进去的对象没有关系啊。我很奇怪这样写为什么会报错?
[/Quote]

lz,还不明白吗?不只是执行函数这么简单,执行了那个函数后m_wallpaper应该是创建了一个画刷才对的。但现在没有创建成功。为什么呢?就是我上面说的,传引用、指针和传非引用并且非指针的区别了。
walfud 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xylicon 的回复:]
如果你传的参数不是引用或者不是指针,那么函数会帮你的参数创建一个临时对象,当函数结束的时候,函数会释放该临时对象。

所以你m_backpaper.CreatePatternBrush(&bitmap) ; 这个句话于你传进去的实参m_wallpaper是没有任何作用的。

lz,引用与指针,这是C++的基础啊。
[/Quote]
如果我只是希望执行他的函数,那与是不是传进去的对象没有关系啊。我很奇怪这样写为什么会报错?

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧