重载=运算符的时候无法赋值

ws02589111 2012-08-27 09:36:10
这是我写的一个重载=的函数
CAccount& CAccount::operator=(CAccount& account )
{
if(&account == this)
{
return *this;
}
m_tonum = account.m_tonum;
m_DisName = account.m_DisName;
m_UserName = account.m_UserName;
m_Password = account.m_Password;
m_LoginPassWord = account.m_LoginPassWord;
m_LoginUserName = account.m_LoginUserName;
m_Domain = account.m_Domain;
m_SipDomain = account.m_SipDomain;
m_IsLeader = account.m_IsLeader;
m_IsViewer = account.m_IsViewer;
m_IsNAT = account.m_IsNAT;
m_IsAuthorized = account.m_IsAuthorized;
return *this;
}

我调试的时候发现在执行完成这个之后,出现这样的情况
第一次执行完毕的时候Account = account;就会出现Account内的值全是乱码,有时候又会出现全是空值的情况
然后程序继续执行到下一个Account .m_tonum = strnum.....这样依此赋值的时候,赋值完毕又发现

赋值操作都保证了右边的操作数是有值的,请教各位啊 这个该怎么解决啊
...全文
198 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ws02589111 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
CAccount ccc = ....
这样直接用operator=赋值是会有问题的,因为你的重载中并没有开辟新内存的操作
[/Quote]
那怎样才是正确的用法呢?我这样用只是偶尔会出现这样的问题 不是每次都出现
竞天问 2012-08-28
  • 打赏
  • 举报
回复
赋值操作符只有在:

CAccount a;
//something
a = b;

时才会调用,这种情况叫“赋值”

在声明一个变量时以等号初始化会调用复制构造函数,不是赋值
ws02589111 2012-08-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
现在也发现了另外一个问题就是
调试时已运行到这个断点下了,但是调试窗口下的 this 指针却是 0x00000000

而且被赋过值的成员 变量 也是 -8348333 之类的,好像没有被初始化过一样
[/Quote]
我是用的release版本调试的。。。输出的话也试过 空的
不过从一个函数跳到另外一个函数之后 又有值了。。中间没有任何其他的调用
zhaoZero41 2012-08-27
  • 打赏
  • 举报
回复
CAccount ccc = ....
这样直接用operator=赋值是会有问题的,因为你的重载中并没有开辟新内存的操作
shentao17792 2012-08-27
  • 打赏
  • 举报
回复
是不是release版本的,没有调试符号,导致调试信息错误。

用debug版本试试看,或者加一些outputdebugstring,将变量的值给打印出来
ws02589111 2012-08-27
  • 打赏
  • 举报
回复
现在也发现了另外一个问题就是
调试时已运行到这个断点下了,但是调试窗口下的 this 指针却是 0x00000000

而且被赋过值的成员 变量 也是 -8348333 之类的,好像没有被初始化过一样

ws02589111 2012-08-27
  • 打赏
  • 举报
回复
图破了 再补上调试信息
- Account {m_tonum={...} m_DisName={...} m_UserName={...} ...} CSipAccount
+ m_tonum {...} std::basic_string<char,std::char_traits<char>,std::allocator<char> >
+ m_DisName {...} std::basic_string<char,std::char_traits<char>,std::allocator<char> >
+ m_UserName {...} std::basic_string<char,std::char_traits<char>,std::allocator<char> >
+ m_Password {...} std::basic_string<char,std::char_traits<char>,std::allocator<char> >
+ m_LoginUserName {...} std::basic_string<char,std::char_traits<char>,std::allocator<char> >
+ m_LoginPassWord {...} std::basic_string<char,std::char_traits<char>,std::allocator<char> >
+ m_Domain {...} std::basic_string<char,std::char_traits<char>,std::allocator<char> >
+ m_SipDomain {...} std::basic_string<char,std::char_traits<char>,std::allocator<char> >
m_IsNAT CXX0030: 错误: 无法计算表达式的值
m_IsViewer CXX0030: 错误: 无法计算表达式的值
m_IsLeader CXX0030: 错误: 无法计算表达式的值
m_IsAuthorized CXX0030: 错误: 无法计算表达式的值
竞天问 2012-08-27
  • 打赏
  • 举报
回复
不是在定义变量时用了等号就以为是赋值了吧
如4楼说


CAccount b = other;

在这里调用的是

CAccount(const CAccount& );
ws02589111 2012-08-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
构造函数写了吗,还有成员变量是private的还是public的?(运行并未出错,编译器为vs2005)
[/Quote]
构造函数写了 初始化string为"" bool类的为false
ws02589111 2012-08-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
看样子像是生成的二进制文件过时了。做一次clean build,就是把以前生成的那些目标文件、可执行文件清理掉。重新编译一遍试试。 希望有用。

要是VS的话,我也不知道有没有对应的按键可用。
[/Quote]
VS2010d的重新生成 清理这些都做过 而且这个问题不是每次都出现 偶尔才会有 莫名其妙的
xiakeliangjian 2012-08-27
  • 打赏
  • 举报
回复
构造函数写了吗,还有成员变量是private的还是public的?(运行并未出错,编译器为vs2005)
郑恪文 2012-08-27
  • 打赏
  • 举报
回复
看样子像是生成的二进制文件过时了。做一次clean build,就是把以前生成的那些目标文件、可执行文件清理掉。重新编译一遍试试。 希望有用。

要是VS的话,我也不知道有没有对应的按键可用。

64,439

社区成员

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

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