一个简单的类,Release编译模式下的小问题,怀疑和=操作符重载有关!

DDGG 2010-01-14 11:39:30
#include "stdafx.h"
#include "stdlib.h"

//////////////// CCellRange 类 ////////////////

class CCellRange
{
public:

CCellRange(int nMinRow = -1, int nMinCol = -1, int nMaxRow = -1, int nMaxCol = -1)
{
Set(nMinRow, nMinCol, nMaxRow, nMaxCol);
}

void Set(int nMinRow = -1, int nMinCol = -1, int nMaxRow = -1, int nMaxCol = -1);

int GetMinRow() const {return m_nMinRow;}
void SetMinRow(int minRow) {m_nMinRow = minRow;}

int GetMinCol() const {return m_nMinCol;}
void SetMinCol(int minCol) {m_nMinCol = minCol;}

int GetMaxRow() const {return m_nMaxRow;}
void SetMaxRow(int maxRow) {m_nMaxRow = maxRow;}

int GetMaxCol() const {return m_nMaxCol;}
void SetMaxCol(int maxCol) {m_nMaxCol = maxCol;}

int GetRowSpan() const {return m_nMaxRow - m_nMinRow + 1;}
int GetColSpan() const {return m_nMaxCol - m_nMinCol + 1;}

void operator=(const CCellRange& rhs);
int operator==(const CCellRange& rhs);
int operator!=(const CCellRange& rhs);

protected:
int m_nMinRow;
int m_nMinCol;
int m_nMaxRow;
int m_nMaxCol;
};

inline void CCellRange::Set(int minRow, int minCol, int maxRow, int maxCol)
{
m_nMinRow = minRow;
m_nMinCol = minCol;
m_nMaxRow = maxRow;
m_nMaxCol = maxCol;
}

inline void CCellRange::operator=(const CCellRange& rhs)
{
if (this != &rhs) Set(rhs.m_nMinRow, rhs.m_nMinCol, rhs.m_nMaxRow, rhs.m_nMaxCol);
}

inline int CCellRange::operator==(const CCellRange& rhs)
{
return ((m_nMinRow == rhs.m_nMinRow) && (m_nMinCol == rhs.m_nMinCol) &&
(m_nMaxRow == rhs.m_nMaxRow) && (m_nMaxCol == rhs.m_nMaxCol));
}

inline int CCellRange::operator!=(const CCellRange& rhs)
{
return !operator==(rhs);
}

//////////////// GetCellRange 函数 ////////////////

CCellRange GetCellRange()
{
CCellRange result(2, 0, -1, -1);

return result;
}

//////////////// 主函数 ////////////////

int main(int argc, char* argv[])
{
CCellRange cellRange;

cellRange = GetCellRange();

// 正确结果应该输出 2,但却输出 -1 (Debug编译时正常)
printf("%d\n", cellRange.GetMinRow());
system("pause");

return 0;
}



开发环境是VC6,Release编译模式
如果调用时写成 CCellRange cellRange = GetCellRange(); 或者取消CCellRange类中对=操作符的重载也正常。
看了=操作符的代码好像没有问题啊
...全文
258 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbjfeng 2010-01-19
  • 打赏
  • 举报
回复
反正不管怎么说,=重载不该返回void吧?
kg307xxb 2010-01-19
  • 打赏
  • 举报
回复
这跟vc6.0编译器优化有关。
函数inline void CCellRange::operator=(const CCellRange& rhs)优化后this == &rhs。

main函数反汇编:
80: int main(int argc, char* argv[])
81: {
00401030 sub esp,10h
82: CCellRange cellRange;
83:
84: cellRange = GetCellRange();
00401033 lea eax,[esp]
00401037 push esi
00401038 push eax
00401039 or esi,0FFh //esi默认值.
0040103C call GetCellRange (00401000)
00401041 lea ecx,[esp+8]
00401045 add esp,4
00401048 cmp ecx,eax //this 与 &rhs比较。
0040104A je main+1Eh (0040104e)
0040104C mov esi,dword ptr [eax] //cellRange.GetMinRow()赋值到esi,this == &rhs不被执行.
85:
86: // 正确结果应该输出 2,但却输出 -1 (Debug编译时正常)
87: printf("%d\n", cellRange.GetMinRow());
0040104E push esi //cellRange.GetMinRow()值.
0040104F push offset string "%d\n" (00408038)
00401054 call _printf (00401106)
DDGG 2010-01-19
  • 打赏
  • 举报
回复
谢谢啊,终于有针对反汇编的解析了,虽然没看懂,但还是结帖了!

to lbjfeng:
重载=操作符是不是应该返回void我也搞不清,这可能是另外一个问题了,不管了!
DDGG 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 taodm 的回复:]
类的成员函数,要么在类内实现,要么就别加inline,就不该折腾。
[/Quote]

这个CCellRange就是大名鼎鼎的CGridCtrl里的啊,并不是我写的。
这个控件在 http://www.codeproject.com/KB/miscctrl/gridctrl.aspx ,大家应该都用过吧。
taodm 2010-01-14
  • 打赏
  • 举报
回复
类的成员函数,要么在类内实现,要么就别加inline,就不该折腾。
DDGG 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sunyeyi 的回复:]
vs2008 正常
不好意思,没法帮你看了
[/Quote]

难道这就是传说中的VC6的bug?
arong1234 2010-01-14
  • 打赏
  • 举报
回复
这只是不合乎规范,但是他的代码似乎确实没有大错误
[Quote=引用 12 楼 pengzhixi 的回复:]
inline void CCellRange::operator=(const CCellRange& rhs)
怎么会返回void
[/Quote]
arong1234 2010-01-14
  • 打赏
  • 举报
回复
似乎只要禁止inline就没问题,似乎在这种情况下vc6在处理operator=内的Set时有bug所致
不过vc6已经没有patch了,即使有bug楼主也无可奈何
hlsoven 2010-01-14
  • 打赏
  • 举报
回复
头痛
pengzhixi 2010-01-14
  • 打赏
  • 举报
回复
inline void CCellRange::operator=(const CCellRange& rhs)
怎么会返回void
arong1234 2010-01-14
  • 打赏
  • 举报
回复
确实如此,很奇怪,研究中
DDGG 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 arong1234 的回复:]
除了你写的测试代码之外,还有其他代码不?即使是不相关的代码也算

[/Quote]

如果有,我就把这帖子打印出来吃下去
taodm 2010-01-14
  • 打赏
  • 举报
回复
珍惜生命,远离VC6.
inline对楼主是祸害。
arong1234 2010-01-14
  • 打赏
  • 举报
回复
不知道有关没关,但是看起来象
楼主看看:
http://blog.vckbase.com/arong/archive/2009/12/30/40598.html
arong1234 2010-01-14
  • 打赏
  • 举报
回复
除了你写的测试代码之外,还有其他代码不?即使是不相关的代码也算
[Quote=引用 6 楼 ddgg 的回复:]
引用 4 楼 arong1234 的回复:
当然你operator=实现也有问题就是,他应该返回一个TYPE&,而不是void
至于你的问题,从给出的代码看,没什么问题,估计你贴的代码不是真实代码



当然是真实的代码,有VC6的同学可以新建一个Win32 Console Application项目,然后在主cpp里贴入顶楼的代码,选Release方式编译后运行。真的输出-1啊,骗你们是小狗
[/Quote]
DDGG 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 arong1234 的回复:]
当然你operator=实现也有问题就是,他应该返回一个TYPE&,而不是void
至于你的问题,从给出的代码看,没什么问题,估计你贴的代码不是真实代码

[/Quote]

当然是真实的代码,有VC6的同学可以新建一个Win32 Console Application项目,然后在主cpp里贴入顶楼的代码,选Release方式编译后运行。真的输出-1啊,骗你们是小狗
FrankSun80 2010-01-14
  • 打赏
  • 举报
回复
vs2008 正常
不好意思,没法帮你看了
arong1234 2010-01-14
  • 打赏
  • 举报
回复
当然你operator=实现也有问题就是,他应该返回一个TYPE&,而不是void
至于你的问题,从给出的代码看,没什么问题,估计你贴的代码不是真实代码
hai040 2010-01-14
  • 打赏
  • 举报
回复
写多个拷贝构造函数试试
arong1234 2010-01-14
  • 打赏
  • 举报
回复
CCellRange cellRange = GetCellRange();
这根本不调用operator=,所以和operator =毫无关系
楼主需要看的是拷贝构造函数
[Quote=引用楼主 ddgg 的回复:]
C/C++ code#include"stdafx.h"
#include"stdlib.h"//////////////// CCellRange 类////////////////class CCellRange
{public:

CCellRange(int nMinRow=-1,int nMinCol=-1,int nMaxRow=-1,int nMaxCol=-1)
{
Set(nMinRow, nMinCol, nMaxRow, nMaxCol);
}void Set(int nMinRow=-1,int nMinCol=-1,int nMaxRow=-1,int nMaxCol=-1);int GetMinRow()const {return m_nMinRow;}void SetMinRow(int minRow) {m_nMinRow= minRow;}int GetMinCol()const {return m_nMinCol;}void SetMinCol(int minCol) {m_nMinCol= minCol;}int GetMaxRow()const {return m_nMaxRow;}void SetMaxRow(int maxRow) {m_nMaxRow= maxRow;}int GetMaxCol()const {return m_nMaxCol;}void SetMaxCol(int maxCol) {m_nMaxCol= maxCol;}int GetRowSpan()const {return m_nMaxRow- m_nMinRow+1;}int GetColSpan()const {return m_nMaxCol- m_nMinCol+1;}voidoperator=(const CCellRange& rhs);intoperator==(const CCellRange& rhs);intoperator!=(const CCellRange& rhs);protected:int m_nMinRow;int m_nMinCol;int m_nMaxRow;int m_nMaxCol;
};

inlinevoid CCellRange::Set(int minRow,int minCol,int maxRow,int maxCol)
{
m_nMinRow= minRow;
m_nMinCol= minCol;
m_nMaxRow= maxRow;
m_nMaxCol= maxCol;
}

inlinevoid CCellRange::operator=(const CCellRange& rhs)
{if (this!=&rhs) Set(rhs.m_nMinRow, rhs.m_nMinCol, rhs.m_nMaxRow, rhs.m_nMaxCol);
}

inlineint CCellRange::operator==(const CCellRange& rhs)
{return ((m_nMinRow== rhs.m_nMinRow)&& (m_nMinCol== rhs.m_nMinCol)&&
(m_nMaxRow== rhs.m_nMaxRow)&& (m_nMaxCol== rhs.m_nMaxCol));
}

inlineint CCellRange::operator!=(const CCellRange& rhs)
{return!operator==(rhs);
}//////////////// GetCellRange 函数////////////////
CCellRange GetCellRange()
{
CCellRange result(2,0,-1,-1);return result;
}//////////////// 主函数////////////////int main(int argc,char* argv[])
{
CCellRange cellRange;

cellRange= GetCellRange();// 正确结果应该输出 2,但却输出 -1 (Debug编译时正常) printf("%d\n", cellRange.GetMinRow());
system("pause");return0;
}

开发环境是VC6,Release编译模式。
如果调用时写成 CCellRange cellRange = GetCellRange(); 或者取消CCellRange类中对=操作符的重载也正常。
看了=操作符的代码好像没有问题啊
[/Quote]
加载更多回复(2)
内容概要:本文围绕考虑阶梯式碳交易与供需灵活双响应的综合能源系统优化调度问题展开研究,提出了一种结合阶梯式碳交易机制与需求侧灵活响应能力的综合能源系统优化调度模型。通过引入阶梯式碳交易机制,激励系统减少碳排放,同时充分挖掘电、热、气等多能负荷的供需双侧灵活性,提升系统运行的经济性与环保性。采用Matlab进行仿真建模与求解,验证了所提模型在降低系统运行成本、提高可再生能源消纳能力和减少碳排放方面的有效性。研究内容涵盖目标函数构建、约束条件设定、多能耦合设备建模以及求解算法实现等关键环节,为低碳、高效、灵活的综合能源系统调度提供了理论支持和技术路径。; 适合人群:具备一定电力系统、能源系统或优化理论基础,从事相关领域研究的研究生、科研人员及工程技术人员,尤其适合关注碳交易机制、需求响应与综合能源系统优化的从业者。; 使用场景及目标:① 掌握阶梯式碳交易机制在综合能源系统调度中的建模方法;② 学习如何量化与整合供需双侧灵活性资源参与系统优化;③ 实现综合能源系统多目标优化调度的Matlab编程与仿真分析;④ 为实际能源系统低碳调度策略制定提供参考依据。; 阅读建议:建议读者结合Matlab代码深入理解模型构建细节,重点关注目标函数中碳交易成本项的设计、需求响应约束的数学表达以及求解过程中多能耦合关系的处理方式,可通过调整参数进行敏感性分析以加深对模型性能的理解。
项目资源包含:可运行源码+sql文件+LW; python3.8+django+mysql5.7+html 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 系统前台都设计实现了手机、智能手表、平板、帖子、畅销榜等这些功能。 系统后台都实现了权限认证、商品管理、订单管理、支付信息管理、购物车管理、用户管理等这些管理。 本项目是一个以Django框架为基础开发的数码性能站系统,专为希望深入学习Python、Django及Web开发技术的学习者设计。该系统资源完整,不仅提供了能够直接运行的源码,还配备了必要的SQL文件和学习资料,适合从初学者到进阶学习者使用,同时也适合作为毕业设计、课程设计、大型作业和工程实训的素材,亦可作为企业初期项目开发的参考。 该系统以数码产品为主题,构建了一个具备丰富功能的在线平台。在前台设计上,系统支持不同设备如手机、智能手表、平板电脑等多种客户端的访问,提供了一个友好的用户界面。用户能够浏览各数码产品,并查看产品的详细信息、畅销排行等,提供了似帖子功能,用户可以围绕产品展开交流讨论。 系统后台管理功能完善,提供了权限认证机制,确保了操作的安全性。通过后台管理平台,管理员可以高效地进行商品管理、订单管理、支付信息管理、购物车管理、用户管理等一系列操作。这些功能的实现,不仅为学习者提供了实践操作的机会,也为将来从事电商平台开发的开发者奠定了基础。 技术栈方面,该项目要求学习者具备一定的Python知识,版本为Python3.8,同时熟悉Django框架,并需要使用到mysql5.7数据库。前端开发则利用了HTML技术。整体上,该系统提供了从数据库设计到前端展示,再到后端逻辑处理的完整开发体验,能够帮助学习者全方位提升Web开发技能。 在项目资料方面,除了源码和数据库文件外,还包括了详细的项目使用说明和重要说明文档,帮助学习者更好地理解和操作整个系统。此外,还提供了旧版程序,便于对比学习和掌握技术演进的脉络。整个项目的设计理念是通过实践来加深对Django框架和Web开发的理解。 该项目是一个内容丰富、功能全面、实践性强的Web开发学习平台,非常适合想要系统学习和掌握Django开发的学生或开发者使用。无论是作为教学案例,还是实际项目练习,它都能提供很好的支持。
内容概要:本文围绕基于两阶段鲁棒优化算法的微网多电源容量配置展开研究,提出了一种能够有效应对可再生能源出力与负荷需求不确定性的优化方法。该方法通过构建包含风能、光伏、储能及柴油机等多种分布式电源的微电网系统模型,采用两阶段鲁棒优化框架,在第一阶段确定各电源的最优容量配置,在第二阶段针对不确定性因素进行调度调整,从而保证系统在各种运行场景下的可靠性与经济性。文中给出了完整的Matlab代码实现,结合YALMIP工具箱调用求解器进行建模求解,便于读者复现与拓展。研究还考虑了实际工程中常见的运行约束与技术限制,提升了方案的实用性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事新能源、微电网、优化调度等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 掌握两阶段鲁棒优化在微电网规划中的建模思路与实现技巧;② 学习如何处理风光出力不确定性问题;③ 借助开源代码快速搭建似优化模型,应用于科研仿真或项目开发。; 阅读建议:建议结合文档中的代码逐行理解建模逻辑,重点关注不确定集合的构建、鲁棒对等转换过程以及YALMIP的语法应用,同时可尝试替换不同的电源型或引入新的约束条件以深化学习效果。

33,318

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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