使用类

时间:2017-03-16 11:47:35

标签: c++ operators

我正在尝试将2个复数加在一起,但我得到了错误:

没有运算符“+”匹配这些操作数

无操作员“<<”匹配这些操作数

#include <iostream>

using namespace std;


class complex
{
public:

    double get_r() { return r; }
    void set_r(double newr) { r=newr; }
    double set_i() { return i; }
    void set_i(double newi) { i = newi; }
private:
    double r, i;

};

int main()
{

complex A, B;
A.set_r(1.0);
A.set_i(2.0);
B.set_r(3.0);
B.set_i(2.0);

complex sum = A+B;
cout << "summen er: " << sum << endl;

        system("PAUSE");
return 0;
};

我对编程很新,但我不明白为什么它不会将这些数字加在一起。我做错了什么?

3 个答案:

答案 0 :(得分:1)

您必须重载运算符+和&lt;&lt; (以及您需要的每一个)用于您定义的类。请注意,运算符只不过是具有特定定义语法的特定函数(运算符+,例如:C = A + B可以理解为C = A.sum(B))。这是一个关于http://en.cppreference.com/w/cpp/language/operators

的链接

答案 1 :(得分:1)

Operator +是针对内置类型和标准库中的某些类型定义的。由于complex是自定义类,因此必须定义应对其执行操作的所有运算符。

operator +可以定义为:

class complex {
    ...
    complex operator + (const complex& other) {
        return complex(get_r() + other.get_r(), get_i() + other.get_i());
    }
    ...
};

请注意,既不允许A++也不允许A-B。他们需要(分别)complex & operator ++()complex operator - (const complex &)

对于流插入,第一个参数是流本身,因此您必须在类外定义一个带有2个参数的友元运算符:

outstream& opererator << (outstream &out, const complex& val) {
    // output it the way you want
    return out;
}

答案 2 :(得分:0)

复数是C ++标准的一部分。以下是http://en.cppreference.com/w/cpp/numeric/complex的示例。

#include <iostream>
#include <iomanip>
#include <complex>
#include <cmath>

int main()
{
    using namespace std::complex_literals;
    std::cout << std::fixed << std::setprecision(1);

    std::complex<double> z1 = 1i * 1i;
    std::cout << "i * i = " << z1 << '\n';

    std::complex<double> z2 = std::pow(1i, 2);
    std::cout << "pow(i, 2) = " << z2 << '\n';

    double PI = std::acos(-1);
    std::complex<double> z3 = std::exp(1i * PI);
    std::cout << "exp(i * pi) = " << z3 << '\n';

    std::complex<double> z4 = 1. + 2i, z5 = 1. - 2i;
    std::cout << "(1+2i)*(1-2i) = " << z4*z5 << '\n';
}

尝试自己实现类复合体需要定义加法,相等和ostream。而且你只有5%的完全实现的类。查看标题本身将揭示编写C ++标准库的人是如何实现整个事情的。

相关问题