2

请帮助这个新手,这是我的代码:

#include <iostream>
using namespace std;

class Complex {
private:
    float r, i;

public:
    Complex(float rr, float ii) : r(rr), i (ii) {}
    float GiveRe () { return r; }
    float GiveIm () { return i; }
    void Setit (float rr, float ii) {
        r = rr;
        i = ii;
    }
};

Complex a(10, 20);

Complex sumit (Complex &ref) {
     static Complex sum (0, 0);
    sum.Setit(sum.GiveRe() + ref.GiveRe(), sum.GiveIm() + ref.GiveIm());
    return sum;
}

int main () {
    Complex sumvalue = sumit (a);
    cout << sumvalue << endl;
    return 0;
}

错误:no match for 'operator<<' in 'std::cout << sumvalue'

程序应该输出一个复数的总和。

4

5 回答 5

2

cout 无法告诉您要输出什么,您需要在类中指定 operator<< 或者可以将您的类隐式转换为兼容类型。

http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/

在您的课程中实现的 Rudolf Mühlbauer 的代码:

在类头中的某处添加:

friend ostream& operator<<(ostream& out, const Complex& compl);

这在标题下方:

ostream& operator<<(ostream& out, const Complex& compl)
{
    return out << compl.r << "/" << compl.i;
}

应更改实施以适合您的确切需求。

于 2012-10-13T20:30:31.137 回答
1

您必须重载"<<"复杂类型的运算符。

#include <iostream>
using namespace std;

class Complex {
private:
    float r, i;

public:
    Complex(float rr, float ii) : r(rr), i (ii) {}
    float GiveRe () { return r; }
    float GiveIm () { return i; }
    void Setit (float rr, float ii) {
        r = rr;
        i = ii;
    }

};

ostream& operator<<(ostream& os, Complex& c)
    {
        float i;
        os<<c.GiveRe();
        if(c.GiveIm() < 0){  
            os<<"-j"<<c.GiveIm()*(-1);
        }else{
            os<<"+j"<<c.GiveIm();
        }
        return os;
    }

Complex a(10, 20);

Complex sumit (Complex &ref) {
     static Complex sum (0, 0);
    sum.Setit(sum.GiveRe() + ref.GiveRe(), sum.GiveIm() + ref.GiveIm());
    return sum;
}

int main () {
    Complex sumvalue = sumit (a);
    cout << sumvalue << endl;
    return 0;
}
于 2012-10-13T20:33:50.313 回答
1

一个完整的最小示例:

#include <iostream>

using namespace std;

class C {
  public: 
    int r, l;
    // if the operator needs access to private fields:
    friend ostream& operator<< (ostream&, const C&);
};

ostream& operator << (ostream& stream, const C& c) {
    stream << c.r << "--" << c.l;
    return stream;
}

int main() {
    C c;
    c.l = 1;
    c.r = 2;
    cout << c << endl;
}

C++ 允许您定义运算符。STL 使用<<运算符进行输出,整个 istream/ostream 类层次结构使用此运算符进行输入/输出。

运算符作为函数实现,但始终遵循非常特定的语法。如示例所示,ostream& operator << (ostream&, const MYTYPEHERE&)是定义 ostream<<运算符的方式。

当 C++ 遇到一个语句时,它必须推断出所有操作数的类型,并(确实非常神奇地)找到问题的解决方案:给定我的操作数和运算符,我能找到一个使语句有效的类型吗?

这些 ofstream 运算符是为某处的所有基本类型定义的<iostream>,因此如果您编写cout << 10,编译器会找到一个运算符ostream& operator<< (ostream&, int)

如果你想在这个游戏中使用用户定义的类型,你必须定义操作符。否则,声明cout << sometype将无效。这也是 C++ 中有时会出现严重编译器错误的原因:“好吧,我定义了一些运算符 <<,但没有一个与您的类型兼容!”。

因为有时为您的类型实现运算符是不利的(例如,如果您只输出一次),我建议编写:

cout << sum.re << "--" << sum.im << endl; // or similar

这样,您编写的代码更少,输出格式也很灵活。谁知道您下次是否希望复数格式不同?但这是另一个讨论。

为什么要复杂这么多?因为 C++ 可能非常复杂。它非常强大,但充满了特殊的语法和例外。最后,与 C 的区别就在这里:C++ 在类型推断(模板需要)方面做得更好,通常会导致 WTF?

关于如何在您的代码中实现它,我认为其他答案提供了很好的解决方案!

于 2012-10-13T20:35:31.220 回答
1

Complex 没有运算符 <<

ostream& Complex::operator << ( ostream& os )
    {
    // use os << field/method here to out put
    return os;
    }

此外,如果 complex 可以以不同的方式显示到控制台,那么您应该考虑使用方法来显示而不是 cout <<

void Complex::DisplayToConsole()
    {
    std::cout << r << " " << i << '\n';
    }
于 2012-10-13T20:29:56.917 回答
0

sumit(a)返回类型为 的对象Complex,该对象cout未定义为处理。

于 2012-10-13T20:31:28.413 回答