如何解决过载转移,因此它支持链接,也应该与 cout 一起使用
所以我尝试根据这个问题的标题编写程序,我的代码只计算第一个。
这是代码
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
class distance {
int feet;
int inches;
string display();
public:
distance();
distance(int,int);
distance operator+(distance);
friend string operator<<(ostream&,distance);
friend string operator<<(string,distance);
friend string operator<<(distance,distance);
};
distance::distance() {
feet = 0;
inches = 0;
}
distance::distance(int feet,int inches) {
this->feet = feet;
this->inches = inches;
}
string distance::display() {
stringstream str;
str << feet << '\'' << inches << '\n';
return str.str();
}
string operator<<(ostream& os,distance distance) {
string out = distance.display();
os << out;
return out;
}
string operator<<(string str,distance distance) {
return (str + distance.display());
}
string operator<<(distance distance1,distance distance2) {
return distance1.display() + distance2.display();
}
int main() {
distance distance(5,8);
distance distance2(5,9);
cout << distance << distance2;
}
我尝试了多种方法,一种有效的方法是,如果我像这样将括号放在 cout 行中 cout << (distance << distance2);
那么它工作正常!
但我希望它可以在没有括号的情况下工作,就像您知道我们如何处理字符串 cout << "abc" << "def";
现在我什至不知道它是否可以用于对象。
这里是一些输出的截图
不带括号 ↴ cout << distance << distance2;
带括号 ↴ cout << (distance << distance2);
如果不使用括号就无法获得与括号相同的输出,那么有人可以告诉我它是如何处理字符串的吗?就像我们没有把括号放在字符串中,但它仍然显示完整。
cout << "abc" << "def";
输出:“abcdef”
解决方法
正常的做法是简单地进行一次重载
//This requires a friend declaration inside the class first.
std::ostream& operator<<(std::ostream& os,const Distance &distance) {
return os << distance.feet << '\'' << distance.inches << '\n';
}
这可以让您按预期链接:
std::cout << 3 << myDistance << myDistance << "hi!"
,
为了支持链接,operator<<(ostream&,Distance)
需要返回给定的 ostream&
,而不是 string
。此外,Distance
应该通过常量引用传递:
ostream& operator<<(ostream& os,const Distance &distance) {
os << distance.display();
return os;
}
operator<<(string,Distance)
和 operator<<(Distance,Distance)
根本没有意义,因此应该完全删除它们。
您错误地实施了 operator<<(ostream&,Distance)
。
因为它返回一个 string
,所以该行:
cout << distance << distance2;
首先计算 cout << distance
,然后解析为...
{temporary std::string} << distance2;
...当然不会再打印任何东西了。
让函数返回对 left 参数的引用。
ostream& operator<<(ostream& os,Distance distance) {
string out = distance.display();
os << out;
return os;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。