重载移位所以它支持链接并且也应该与 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) 根本没有意义,因此应该完全删除它们。