这个重载+ 的错误怎么改,如果去掉const就没错了,但是却想用const

shdiao 2003-10-17 12:30:09
/* quantic: include two class :item and quantic
* this is a quantic class
*/
#include <iostream>
#include <vector>
using namespace std;

class quitem
{
public:
quitem(){};
quitem(int a,int b):_con(a),_exf(b){};
quitem(const quitem& rhs)
{
_con=rhs._con;
_exf=rhs._exf;
}
~quitem(){};
int& con(){return _con;}
int& exf(){return _exf;}
quitem& operator=(const quitem&);
private:
int _con,_exf;
};

quitem& quitem::operator=(const quitem& rhs)
{
_con=rhs._con;
_exf=rhs._exf;
return *this;
}
/***************************************************/
class quantic
{
public:
quantic(){};
quantic(const quantic&);
~quantic(){};
void creat();

quantic& operator=(const quantic&);
quantic operator-(const quantic&)const;
quantic operator+(const quantic&)const;
quantic operator*(const quantic&)const;
quantic operator/(const quantic&)const;

friend ostream& operator<<(ostream&,quantic&);
private:
vector<quitem> _qup;
};
//***************************************************
quantic::quantic(const quantic& rhs)
{
_qup=rhs._qup;
}
//***************************************************
quantic& quantic::operator=(const quantic& rhs)
{
_qup=rhs._qup;
return *this;
}
//***************************************************
quantic quantic::operator+(const quantic& rhs) const
{
quantic temp(rhs);

vector<quitem>::iterator qiter=temp._qup.begin();
vector<quitem>::const_iterator iter=_qup.begin();
for( ; iter!=_qup.end(); ++iter)
{
for(qiter=temp._qup.begin();qiter!=temp._qup.end();qiter++)
{
//if their exf is equal,add their con
if(iter->exf()==qiter->exf() )
{
qiter->exf()=qiter->exf()+iter->exf();
goto addend;
}
}
temp._qup.push_back(quitem(iter->con(),iter->exf() ) );
addend:;
}
return temp;
}
以下是报错:
Compiling...
question.cpp
D:\cpp\shenfuxing\question.cpp(74) : error C2662: 'exf' : cannot convert 'this' pointer from 'const class quitem' to 'class quitem &'
Conversion loses qualifiers
D:\cpp\shenfuxing\question.cpp(76) : error C2662: 'exf' : cannot convert 'this' pointer from 'const class quitem' to 'class quitem &'
Conversion loses qualifiers
D:\cpp\shenfuxing\question.cpp(80) : error C2662: 'con' : cannot convert 'this' pointer from 'const class quitem' to 'class quitem &'
Conversion loses qualifiers
D:\cpp\shenfuxing\question.cpp(80) : error C2662: 'exf' : cannot convert 'this' pointer from 'const class quitem' to 'class quitem &'
Conversion loses qualifiers
Error executing cl.exe.

question.obj - 4 error(s), 0 warning(s)
...全文
48 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sandrowjw 2003-10-18
  • 打赏
  • 举报
回复
俄?用friend怎么玩?

我只知道如果要不用重载处理const环境下的引用(对于const CName&的对象,只能获得对他的成员的const引用),就只有让你的类包含一个指针(vector*)而不是整个对象,指针可以比较灵活地避过const,但是代码会比较复杂一些,不仅仅要自己处理那个指针指向对象的生存期,而是会陷入一个const语义检查的怪圈。(如果楼主有兴趣可以研究一下,我看到这个东西就头晕,特别是在有template的时候)
bamboocxz 2003-10-18
  • 打赏
  • 举报
回复
楼上的说的好,对局部变量的引用不是好习惯,C++ Primer上有对于重载的详尽的描述……
Wolf0403 2003-10-18
  • 打赏
  • 举报
回复
quantic operator+(const quantic& lhs, const quantic& rhs) // 不要返回局部变量的引用
{
quantic temp(rhs);

vector<quitem>::iterator qiter = temp._qup.begin();
vector<quitem>::const_iterator iter = lhs._qup.begin();
for( ; iter!=lhs._qup.end(); ++iter)
{
for(qiter=temp._qup.begin();qiter!=temp._qup.end();qiter++)
{
//if their exf is equal,add their con
if(iter->exf() == qiter->exf() )
{
qiter->exf() = qiter->exf() + iter->exf();
goto addend;
}
}
temp._qup.push_back(quitem(iter->con(),iter->exf() ) );
addend:;
}
return temp;
}
sandrowjw 2003-10-17
  • 打赏
  • 举报
回复
重载一下就可以了
int& con(){return _con;}
const int& con() const { return _con; }
int& exf(){return _exf;}
const int& exf()const {return _exf;}
Andy84920 2003-10-17
  • 打赏
  • 举报
回复
最好把public:写在前面.
private:写在后面!习惯!

sandrowjw(伊巴密浓达) 说的不好吧?
应该用friend比较好.这样不用重载这么麻烦了.
还有你的实现里面用goto?? 不好的编程风格!
可以改下设计 !
cmsbai 2003-10-17
  • 打赏
  • 举报
回复
就象书写格式,没有什么大问题,但是别人看你的类,是看它能做什么,而不是它有哪些属性,所以最好先public,后private
darcymei 2003-10-17
  • 打赏
  • 举报
回复
说到好习惯,重载等号时判断是否复制自己,不改变类成员的成员函数应声明成const(楼主这样声明了也就没问题了),构造函数能用定义的不用赋值.......楼主可以借鉴下:)至于private写前写后,不懂y!是不是类默认成员是private,这样public写后就不用写private了 (当然也是避免漏写),活活,见笑。还请高手指点。。。
shdiao 2003-10-17
  • 打赏
  • 举报
回复
arbraham(云庆)

怎么我看 c++ primer 里面的风格都是 public在前 private在后
arbraham 2003-10-17
  • 打赏
  • 举报
回复
你怎么总是把private放到后面呢? 好习惯是放到前面。
williamVII 2003-10-17
  • 打赏
  • 举报
回复
nod.
两个版本都要写的.

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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