我正在尝试将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;
};
我对编程很新,但我不明白为什么它不会将这些数字加在一起。我做错了什么?
答案 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 ++标准库的人是如何实现整个事情的。