重载移位所以它支持链接并且也应该与 cout 一起工作
overload shift so it supports chaining and also should work with cout
所以我试着按照这个题目的Title做了程序,我的代码只计算出第一个
这是代码
#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 << (distance << distance2);
在该 cout 行中放置方括号,那么它就可以正常工作!
但我希望它在没有括号的情况下工作,就像你知道我们如何使用字符串一样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)
不正确。
既然你有它 returning a string
,行:
cout << distance << distance2;
首先评估 cout << distance
,然后解析为...
{temporary std::string} << distance2;
...当然不会再打印任何东西了。
让函数 return 引用 left 参数。
ostream& operator<<(ostream& os, Distance distance) {
string out = distance.display();
os << out;
return os;
}
要支持链接,operator<<(ostream&, Distance)
需要 return 给定的 ostream&
,而不是 string
。此外,Distance
应该通过 const 引用传递:
ostream& operator<<(ostream& os, const Distance &distance) {
os << distance.display();
return os;
}
operator<<(string, Distance)
和 operator<<(Distance, Distance)
根本没有意义,因此应该完全删除它们。
所以我试着按照这个题目的Title做了程序,我的代码只计算出第一个
这是代码
#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 << (distance << distance2);
在该 cout 行中放置方括号,那么它就可以正常工作!
但我希望它在没有括号的情况下工作,就像你知道我们如何使用字符串一样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)
不正确。
既然你有它 returning a string
,行:
cout << distance << distance2;
首先评估 cout << distance
,然后解析为...
{temporary std::string} << distance2;
...当然不会再打印任何东西了。
让函数 return 引用 left 参数。
ostream& operator<<(ostream& os, Distance distance) {
string out = distance.display();
os << out;
return os;
}
要支持链接,operator<<(ostream&, Distance)
需要 return 给定的 ostream&
,而不是 string
。此外,Distance
应该通过 const 引用传递:
ostream& operator<<(ostream& os, const Distance &distance) {
os << distance.display();
return os;
}
operator<<(string, Distance)
和 operator<<(Distance, Distance)
根本没有意义,因此应该完全删除它们。