微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

过载转移,因此它支持链接,也应该与 cout 一起使用

如何解决过载转移,因此它支持链接,也应该与 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;

without brackets

带括号 ↴ cout << (distance << distance2);

with brackets

如果不使用括号就无法获得与括号相同的输出,那么有人可以告诉我它是如何处理字符串的吗?就像我们没有把括号放在字符串中,但它仍然显示完整。

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 举报,一经查实,本站将立刻删除。