【问题标题】:What's wrong with my ostream overloading? [closed]我的 ostream 超载有什么问题? [关闭]
【发布时间】:2021-07-13 12:50:32
【问题描述】:

我是一名学生。我目前正在学习 c++ 运算符重载,但我的代码似乎没有发现任何问题,但以下代码没有输出:

#include <iostream>
using namespace std;
class Float {
private:
    float data;
public:
    Float(float data = 0)
      : data(data) {}
    friend Float operator+(const Float& a, const Float& b);
    friend Float operator-(const Float& a, const Float& b);
    friend Float operator*(const Float& a, const Float& b);
    friend Float operator/(const Float& a, const Float& b);
    friend ostream& operator<<(ostream& out, Float a);
};
ostream& operator<<(ostream& out, Float a) {
    out << a.data;
    return out;
}
Float operator+(const Float& a, const Float& b) {
    return Float(a + b);
}
Float operator-(const Float& a, const Float& b) {
    return Float(a - b);
}
Float operator*(const Float& a, const Float& b) {
    return Float(a * b);
}
Float operator/(const Float& a, const Float& b) {
    return Float(a / b);
}
int main() {
    Float f1, f2;
    f1 = 2.5;
    f2 = 3.1;
    cout << "f1+f2: "
         << (f1 + f2) << endl
         << "f1-f2: "
         << (f1 - f2) << endl
         << "f1*f2: "
         << (f1 * f2) << endl
         << "f1/f2: "
         << (f1 / f2) << endl;
}

我尝试了很多变体,例如将 const 和更多内容放在重载部分,但这似乎不起作用。

【问题讨论】:

  • Float(a + b) 是无限递归,你想要Float(a.data + b.data)
  • Float operator+(const Float&amp; a, const Float&amp; b) 中,您执行return Float(a + b);ab 的类型是什么?他们会调用哪个操作员将它们加在一起?看到问题了吗?
  • @rawrex endl 做得更多,但无法解释为什么这里没有输出
  • 浮点运算符+(const Float& a, const Float& b) { return Float(a + b);这将永远保持自我调用......你需要做 Float operator+(const Float& a, const Float& b) { return Float(a.data + b.data); } 你所有的操作符都需要修复。
  • @rawrex: 从std::endl 刷新对于初学者来说甚至更好,因为他们在错误行之前没有“丢失输出”。

标签: c++ operator-overloading


【解决方案1】:
#include <iostream>
using namespace std;
class Float {
private:
    float data;
public:
    Float(float data = 0)
      : data(data) {}
    friend Float operator+(const Float& a, const Float& b); 
    friend Float operator-(const Float& a, const Float& b); 
    friend Float operator*(const Float& a, const Float& b); 
    friend Float operator/(const Float& a, const Float& b); 
    friend ostream& operator<<(ostream& out, Float a); 
};
ostream& operator<<(ostream& out, Float a) {
    out << a.data;
    return out;
}
Float operator+(const Float& a, const Float& b) {
    return Float(a.data + b.data);
}
Float operator-(const Float& a, const Float& b) {
    return Float(a.data - b.data);
}
Float operator*(const Float& a, const Float& b) {
    return Float(a.data * b.data);
}
Float operator/(const Float& a, const Float& b) {
    return Float(a.data / b.data);
}
int main() {
    Float f1, f2; 
    f1 = 2.5;
    f2 = 3.1;
    cout << "f1+f2: "
         << (f1 + f2) << endl
         << "f1-f2: "
         << (f1 - f2) << endl
         << "f1*f2: "
         << (f1 * f2) << endl
         << "f1/f2: "
         << (f1 / f2) << endl;
}

原因是您的操作员的原始实现如下所示:

Float operator+(const Float& a, const Float& b) {
    return Float(a + b);
}

但是ab 的类型是Float。这将调用 operator +(Float, Float) 作为参数本身。它将一次又一次地调用自己,直到它崩溃。

【讨论】:

  • 谢谢大家,我从你的 cmments 中发现了问题,我猜 c++ 应该有自己的方式让它成为错误代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 2013-02-11
  • 2014-06-26
  • 2015-02-04
  • 2017-12-11
  • 1970-01-01
相关资源
最近更新 更多