2017-03-16 36 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++標準庫的人如何實現整個事情。