2017-03-16 48 views
1

我试图加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; 
}; 

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

+2

它是*你的类,那么编译器如何知道你想将它们加在一起? – crashmstr

+0

我不知道你想达到什么,但也许你应该考虑使用std :: complex; –

+0

如果您想了解更多关于复杂类的实现,请看看GNU ISO C++库如何实现std :: complex(https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/ api/a00812_source.html) –

回答

1

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

+0

我似乎无法找到放置运算符+的正确位置。 是否正确,我需要一个操作符,因为我使用类? – Asger

+0

基本操作符(+,++,/,<<等)实际上只是函数,正如所告知的那样,并且对于每种基元数据类型都默认为重载。但是如果你生成一个新的数据类型(即一个类,一个结构等),那么你应该定义哪一个应该是你的数据类型的行为。如果你对编程真的很陌生,也许你应该考虑用Java来进行类管理学习,或者纯C用于纯粹的基础(没有类,但是数据类型,运算符,字符串等等),因为C++可能有点复杂,因为它有指针运算。 – DvTr

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; 
} 
+0

我想我明白了。但我不明白other.get_r() 什么是其他? – Asger

+0

@AsgerBechNybo'A + B'将由编译器在'A.operator +(B)'中进行翻译。所以在这里,A将是'* this'而B是'other'。 –

1

复数是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++标准库的人如何实现整个事情。