mutable在这种情况下到底需不需要?(高手进)

thinkperson_x200 2012-07-12 02:20:29
我现在正在维护一个程序的界面,使用了mutable,这个界面使用wxWidgits写的,要实时更新进度(剩余多长时间转换完成),我说一下程序的大致流程:

mutable wxString timeLeft; //记录还剩余多长时间的字符变量,因为要在程序的一个地方被写,OnPaint()中读取,所以用mutable

void CShow::OnPaint(wxPaintEvent& WXUNUSED(event) )
{
wxPaintDC dc( this );
PrepareDC( dc );

wxSize sz = GetClientSize();
wxRect rect(0, 0, sz.x, sz.y);

// 画一个大背景
if (m_wxBmpBackground.IsNull())
return;

wxMemoryDC memDC;
memDC.SelectObject(m_wxBmpBackground);
dc.Blit(0, 0, m_wxBmpBackground.GetWidth(), m_wxBmpBackground.GetHeight(), & memDC, 0, 0, wxCOPY, true);
dc.SetFont(*wxNORMAL_FONT);
dc.SetTextForeground(wxColour(wxT("#0046d5")));
dc.DrawText(timeLeft, wxPoint(20, 32));
}


...

timeleft = ...//在这里给timeLeft变量赋值
Refresh(); //强制重新绘制,调用OnPaint(),从而在界面上显示timeLeft的值

因为程序在运行中会快速改变timeLeft的值,所以我使用mutable来声明timeLeft,因为这样的话,OnPaint()重绘制的时候,就会直接从内存中读取timeLeft的值,而不是timeLeft的副本,这样可以达到很好的实时性(个人观点)。

但我的同事看了我写的上述代码后,认为没有必要使用mutable,因为timeLeft对于该cpp就是全局的,我去掉mutable,结果也是正确的,界面也更新了显示。

但我们知道OnPaint()在界面产生微小改变的时候都会重绘,调用频率很高,所以我担心OnPaint()在一个时间段内读取的只是timeLeft的副本,而不是真实的timeLeft的值,虽然程序运行没有见到显示值的异常,但正确的作法应该加上mutable,不知道我说的有没有道理?
...全文
108 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

既然你去掉编译没出错,那就是白加了。

一种可能的情况是,过去该类有个const函数,里面会修改该变量。后来该函数被去掉了,但mutable忘记删了。
[/Quote]
++
我对mutable这个关键字的了解,就是2楼说那么多
IVERS0N 2012-07-12
  • 打赏
  • 举报
回复
突破const
W170532934 2012-07-12
  • 打赏
  • 举报
回复
mutable和const相应的,但是我好像在楼主的描述中没有看到和const相关的东西嘛。既然这样的话,你的mutable应该是白加了
FrankHB1989 2012-07-12
  • 打赏
  • 举报
回复
LZ把mutable和volatile搞混了?mutable只是无视成员函数修饰的const而已。
不清楚LZ具体是怎么搞的。如果读写状态在唯一线程就不用管,多线程volatile也无益,该锁就锁。
一叶之舟 2012-07-12
  • 打赏
  • 举报
回复
顶一下,加点人气。
luciferisnotsatan 2012-07-12
  • 打赏
  • 举报
回复
既然你去掉编译没出错,那就是白加了。

一种可能的情况是,过去该类有个const函数,里面会修改该变量。后来该函数被去掉了,但mutable忘记删了。
luciferisnotsatan 2012-07-12
  • 打赏
  • 举报
回复
用mutable修饰的成员变量不受const成员方法的限制

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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