运算符重载小问题,头痛一晚上了

五号智能 2008-06-24 08:56:57
[code=C/C++]
#include <iostream>
using namespace std;

class Sales_item
{
string isbn; //条形码
int num; //数量
double price; //价格
public:

Sales_item ():isbn(""),num(0), price(0){}

Sales_item (string str, int ival, double dprice):isbn(str), num(ival), price(dprice){}


Sales_item (Sales_item& temp)
{
num = temp.num;
price = temp.price;
}

~Sales_item (){}

friend ostream& operator <<(ostream &out, const Sales_item& temp)
{
out << temp.isbn << " " << temp.num << " " << temp.price <<endl;
return out;
}
friend Sales_item operator +(const Sales_item& tmp1, const Sales_item& tmp2)
{
Sales_item temp;
temp.num = tmp1.num + tmp2.num;

return temp;
}
Sales_item& operator = (Sales_item& tmp2)
{
num = tmp2.num;
price = tmp2.price;
return *this;

}
};

int main()
{
Sales_item test1("adf",5,5.6);


Sales_item test2,test3;

test2=test1;

test3 = test1+test2; //编译时这句出错,不是重载+,就是重载=号有问题,可是我自己看不出来

cout <<test2<<endl;

system("pause");
return 0;
}
...全文
260 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
五号智能 2008-06-24
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

class Sales_item
{
string isbn; //条形码
int num; //数量
double price; //价格
public:

Sales_item ():isbn(""),num(0),price(0){}

Sales_item (string str, int ival,double dprice):isbn(str),num(ival),price(dprice){}


Sales_item (const Sales_item& temp)
{
num=temp.num;
price=temp.price;
}

~Sales_item (){}

friend ostream& operator <<(ostream &out, const Sales_item& temp)
{
out <<temp.isbn<<" "<<temp.num<<" "<<temp.price<<endl;
return out;
}

friend istream& operator >>(istream &in, Sales_item& temp)
{
in >>temp.isbn>>temp.num>>temp.price;
}

Sales_item operator +(const Sales_item& tmp2)
{
Sales_item temp;
temp.num=this->num+tmp2.num;

return temp;
}

friend Sales_item operator -(const Sales_item& tmp1, const Sales_item& tmp2)
{
Sales_item temp;
temp.num=tmp1.num-tmp2.num;

return temp;
}

friend bool operator ==(const Sales_item& tmp1, const Sales_item& tmp2)
{
if (tmp1.isbn==tmp2.isbn)
return true;
else return false;
}

Sales_item& operator = (const Sales_item& tmp2)
{
num = tmp2.num;
price = tmp2.price;
return *this;

}

};


int main()
{
Sales_item test1("adf",5,5.6);


Sales_item test2,test3;

test2=test1;

test3 = test1+test2;

cout <<test2<<endl;

system("pause");
return 0;
}
五号智能 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
Sales_item& operator = (const Sales_item& tmp2)
兄弟,认真啊。写了那么多const,咋就这个丢了。

[/Quote]

正解,
我的拷贝函数和等号函数都没有用const是这个问题的主要错误,我一直在改=号这边了,
没注意拷贝函数。错误的原因在于,非const引用不可绑定右值,比如
int a=5;
int &b=a;
int &c=b+a; //这句是错误的,俺就错在这里了。



fallening 2008-06-24
  • 打赏
  • 举报
回复
]$ cat op.cc
#include <iostream>
using namespace std;

class Sales_item
{
string isbn; //���
int num; //��
double price; //�۸�
public:

Sales_item ():isbn(""),num(0), price(0){}

Sales_item (string str, int ival, double dprice):isbn(str), num(ival), price(dprice){}


Sales_item ( const Sales_item& temp)
{
num = temp.num;
price = temp.price;
}

~Sales_item (){}

ostream& print( ostream& out ) const
{
out << isbn << " " << num << " " << price <<endl;
return out;
}

Sales_item& operator = (const Sales_item& tmp2)
{
num = tmp2.num;
price = tmp2.price;
return *this;
}

Sales_item& operator +=( const Sales_item& other )
{
num += other.num;
return *this;
}

friend ostream& operator <<(ostream &out, const Sales_item& temp)
{
return temp.print( out );
}
friend const Sales_item operator +(const Sales_item& tmp1, const Sales_item& tmp2)
{
Sales_item tmp(tmp1);
tmp += tmp2;
return tmp;
}
};

int main()
{
Sales_item test1("adf",5,5.6);


Sales_item test2,test3;

test2=test1;

test3 = test1+test2; //����������������������أ�����⣬����Լ��������

cout <<test2 <<endl;

//system("pause");
return 0;
}

$ g++ -o op op.cc -Wall
$ ./op
5 5.6

kkndciapp 2008-06-24
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
using namespace std;

class Sales_item
{
string isbn; //条形码
int num; //数量
double price; //价格
public:

Sales_item ():isbn(""),num(0),price(0){}

Sales_item (string str, int ival,double dprice):isbn(str),num(ival),price(dprice){}


Sales_item (const Sales_item& temp)
{
num=temp.num;
price=temp.price;
}

~Sales_item (){}

friend ostream& operator <<(ostream &out, const Sales_item& temp)
{
out <<temp.isbn<<" "<<temp.num<<" "<<temp.price<<endl;
return out;
}

friend istream& operator >>(istream &in, Sales_item& temp)
{
in >>temp.isbn>>temp.num>>temp.price;
}

Sales_item& operator+( const Sales_item& tmp2)
{
// les_item temp;
isbn=isbn+tmp2.isbn;
num=num+tmp2.num;

return *this;
}

Sales_item& operator-( const Sales_item& tmp2)
{

num=num-tmp2.num;

return *this;
}

friend bool operator ==( const Sales_item& tmp1,const Sales_item& tmp2)
{
if (tmp1.isbn==tmp2.isbn)
return true;
else return false;
}
Sales_item& operator = (Sales_item& tmp2)
{
isbn=tmp2.isbn;
num=tmp2.num;
price=tmp2.price;
return *this;

}

};


int main()
{
Sales_item test1("adf",5,5.6);
Sales_item test2,test3;

test2=test1;
cout<<test2;
test3=test1+test2;

cout <<test3<<endl;
system("pause");
return 0;
}
kkndciapp 2008-06-24
  • 打赏
  • 举报
回复
那个哪里是要去引用,跟引用一点关系也没有[Quote=引用 9 楼 day572 的回复:]
Sales_item& operator = (Sales_item& tmp2) //应该是这个问题,把这个引用去掉
{
num = tmp2.num;
price = tmp2.price;
return *this;

}
[/Quote]
day572 2008-06-24
  • 打赏
  • 举报
回复
Sales_item& operator = (Sales_item& tmp2) //应该是这个问题,把这个引用去掉
{
num = tmp2.num;
price = tmp2.price;
return *this;

}


poor_coder 2008-06-24
  • 打赏
  • 举报
回复
其实问题很简单。
1: test1+test2;调用重载+运算符会产生一个临时对象。
2: test3 = test1+test2;会调用=操作符
Sales_item& operator = (Sales_item& tmp2)
{
num = tmp2.num;
price = tmp2.price;
return *this;

}
而参数为test2. 问题处在参数类型为Sales_item& tmp2,传递的参数为(test1 + test2),为一个临时对象。
临时对象都是不可修改了,不能使用非const引用,必须将参数类型声明为const Sales_item& tmp2才能通过。
已经经过测试,没有问题。
五号智能 2008-06-24
  • 打赏
  • 举报
回复
呃。。。自己看出来了,,,,拷贝函数。。。也没const
五号智能 2008-06-24
  • 打赏
  • 举报
回复
83 G:\文档\c++\lxt\lxt001.cpp no matching function for call to `Sales_item::Sales_item(Sales_item)'
note G:\文档\c++\lxt\lxt001.cpp:22 candidates are: Sales_item::Sales_item(Sales_item&)

按5楼的改了一下,,,还是通不过。。。
太乙 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
Sales_item& operator = (const Sales_item& tmp2)
兄弟,认真啊。写了那么多const,咋就这个丢了。
[/Quote]

这个没啥吧??
太乙 2008-06-24
  • 打赏
  • 举报
回复


#include <iostream>
using namespace std;

class Sales_item
{
string isbn; //ÌõÐÎÂë
int num; //ÊýÁ¿
double price; //¼Û¸ñ
public:

Sales_item ():isbn(""),num(0), price(0){}

Sales_item (string str, int ival, double dprice):isbn(str), num(ival), price(dprice){}


Sales_item (Sales_item& temp)
{
num = temp.num;
price = temp.price;
}

~Sales_item (){}

friend ostream& operator <<(ostream &out, const Sales_item& temp)
{
out << &(temp.isbn[0]) << " " << temp.num << " " << temp.price <<endl; //string的输出得注意~~
return out;
}
Sales_item operator +(const Sales_item& tmp1) //不要为友元
{
Sales_item temp;
temp.num = tmp1.num + num;

return temp;
}
Sales_item& operator = (Sales_item& tmp2)
{
num = tmp2.num;
price = tmp2.price;
return *this;

}
};

int main()
{
Sales_item test1("adf",5,5.6);


Sales_item test2,test3;

test2=test1;

test3 = test1+test2; //

cout <<test2 <<endl;

system("pause");
return 0;
}


五号智能 2008-06-24
  • 打赏
  • 举报
回复
DEV-c++4,9.9.2
babyvox1999 2008-06-24
  • 打赏
  • 举报
回复
什么编译器,没啥错。。。
五号智能 2008-06-24
  • 打赏
  • 举报
回复
呵呵,,,,,,因为这个出了错误,一直在改啊改的,,
taodm 2008-06-24
  • 打赏
  • 举报
回复
Sales_item& operator = (const Sales_item& tmp2)
兄弟,认真啊。写了那么多const,咋就这个丢了。
day572 2008-06-24
  • 打赏
  • 举报
回复
我的理解:
test3=test1+test2;
test1+test2//会产生一个临时变量 Sales_item,这个变量赋值给test3
这时,有两种方法处理:
1.值传递:
Sales_item& operator = (Sales_item tmp2)//我所说的去掉引用
2.把这个临时变量给一个引用,
但是在c++ 语法里: 一个临时变量给一个引用typename &,就是一个non_cons &时,是绝对不行的
必须用const &,涉及到左值,右值就太多了
所以用这个方法:
Sales_item& operator = (const Sales_item &tmp2)//
wangdeqie 2008-06-24
  • 打赏
  • 举报
回复
vc6.0下加个#include<string>就可以了,Sales_item (const Sales_item& temp)里加不加const对本程序并不影响,因为定义的类对象不是const的,当然提倡加const!(一,防止被修改 二,兼容const的类对象) 如果类对象有const的,就必须加!
五号智能 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 linxy2002 的回复:]
out < < temp.isbn < < " " < < temp.num < < " " < < temp.price < <endl;

//temp.isbn string 可以直接cout < < 么?
[/Quote]
可以直接cout


[Quote=引用 15 楼 linxy2002 的回复:]
老大,你测试一下,行不? 按照楼主以前的做法,
test3 = test1+test2;
是要找这个拷贝函数 Sales_item& operator = (Sales_item tmp2 )但是没有找到.
当然
也可以添加
Sales_item& operator = (const Sales_item &tmp2 )//也可以
[/Quote]

没看明白你理解的东西,但赋值和初始化是不一样的,test3=test1+test2, 这个是赋值而不是初始化,赋值的时候是要找operatrot = 号的 ,初始化是找拷贝函数。不过,无论找什么,这个函数都得对,在函数里出现错误就不行了。在我的问题里,拷贝函数和operator=()这两个函数都出了致命的错误,所以这个加法不成功。

在我的拷贝函数和operator =()函数里,都用了非const引用做为右值参加运算,这是错误的根本,右值是不可以绑定到非const引用上的,只有const引用才能绑定右值。

VC可能是不对这个检查的,此类操作会通过,但有的时候结果并不正确,
非const引用参加右值的时候是不安全的,const引用本来就是要建一个临时对象的,以使被引用值不可被改变。而非const引用是直接指向对象,你对它操作就意谓着对象的改变。运算法则里,右值的内容是不可被改变的值。所以当非const引用直接右值参加运算的时候,编译器会报错。

以上都是本人自己理解,可能会有错误的地方,希望有高手写个详细的正确解释



linxy2002 2008-06-24
  • 打赏
  • 举报
回复
引用 1 楼 taodm 的回复:
Sales_item& operator = (const Sales_item& tmp2)
兄弟,认真啊。写了那么多const,咋就这个丢了。



正解,
我的拷贝函数和等号函数都没有用const是这个问题的主要错误,我一直在改=号这边了,
没注意拷贝函数。错误的原因在于,非const引用不可绑定右值,比如
int a=5;
int &b=a;
int &c=b+a; //这句是错误的,俺就错在这里了。



// 怎么感觉你在误人子弟啊, 你就是把赋值重载删了也不会出错的,因为你已经有了拷贝构造函数 Sales_item& operator = (Sales_item& tmp2)
{
num = tmp2.num;
price = tmp2.price;
return *this;

}
linxy2002 2008-06-24
  • 打赏
  • 举报
回复
out < < temp.isbn < < " " < < temp.num < < " " < < temp.price < <endl;

//temp.isbn string 可以直接cout<< 么?
加载更多回复(1)

65,187

社区成员

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

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