2016-05-16 4 views
0

私はこのプログラムでほとんど終わりましたが、単項否定関数を適用する際に問題があります。C++での単項否定

私は複素数の計算に基づいてプログラムを作っていますが、これまでは完全な負数部分を除いて完全にうまく動作しています。私は単なる否定をコード内で動作させる方法を見つけ出すことができません。私に警告したり、ランタイムエラーで私をクラッシュさせたりすることはありません。私の時間のファイルで

、私はこれがあります。

Complex operator-(const Complex &lhs); 

をし、私のcppファイルに、私は私が上に書いたものからこれを作成しようとしました:

Complex operator-(const Complex &lhs) 
{ 
    return Complex(-lhs); 
} 

私は自分で書いたコードcppファイルは私に警告C4717エラー:"'演算子 - ':すべての制御パスで再帰、関数はランタイムスタックオーバーフローの原因となります。もちろん、上記の数値を適用すると実行時エラーが発生します。

あなたには完全なコードがほしいと思うので、ここには:header、cpp、およびtestファイルがあります。 :)

私は助けていただきありがとうございます。

ヘッダファイル:

#ifndef com_H 
#define com_H 
#include <iostream> 
#include <string> 

using namespace std; 


/********** CLASS **********/ 

class Complex 
{ 

    //The BFFs: Stream Insertion and Operators// 

    friend istream &operator >> (istream &lhs, Complex &rhs); 
    friend ostream &operator << (ostream &lhs, const Complex &rhs); 

private: 

    float real, img; 

public: 
      //Complex Constructor// 

    Complex(float new_real = 0.0, float new_img = 0.0); 

      //Complex Set-and-Get Functions// 

    void setComplex(float new_real, float new_img); 
    float getReal() const { return real; } 
    float getImg() const { return img; } 

      //Complex Functions// 

    Complex &operator+=(const Complex &rhs); 
    Complex &operator-=(const Complex &rhs); 
    Complex &operator*=(const Complex &rhs); 
    Complex &operator/=(const Complex &rhs); 

}; 


/********** O P E R A T O R **********/ 



Complex operator+(const Complex &lhs, const Complex &rhs); 
Complex operator-(const Complex &lhs, const Complex &rhs); 
Complex operator*(const Complex &lhs, const Complex &rhs); 
Complex operator/(const Complex &lhs, const Complex &rhs); 

//COMPARISON OPERATORS*/ 

bool operator==(const Complex &lhs, const Complex &rhs); 
bool operator!=(const Complex &lhs, const Complex &rhs); 
bool operator<(const Complex &lhs, const Complex &rhs); 
bool operator<=(const Complex &lhs, const Complex &rhs); 
bool operator>(const Complex &lhs, const Complex &rhs); 
bool operator>=(const Complex &lhs, const Complex &rhs); 

//NEGATION// 
Complex operator-(const Complex &lhs); 

#endif 

のcppファイル:

#include <iostream> 
#include <string> 
#include <stdlib.h> 
#include <math.h> 
#include "com.h" 

using namespace std; 

// 
//***************** COMPLEX CONSTRUCTORS *****************// 
// 
Complex::Complex(float new_real, float new_img) 
{ 
    real = new_real; 
    img = new_img; 
} 

void Complex::setComplex(float new_real, float new_img) 
{ 
    real = new_real; 
    img = new_img; 
} 


// 
//***************IF REAL NUMBER IS ZERO CHECK***************// 
// 

void checkNum(char ops, float new_img) 
{ 
    char i = 'i'; 

    if (new_img == 0) 
    { 
     cout << "0"; 
    } 

    else if (new_img != 1 && ops == '-') 
    { 
     new_img *= -1; 

     cout << new_img << i; 
    } 

    else if (new_img == 1 && ops == '-') 
    { 
     cout << "-i"; 
    } 

    else if (new_img == 1) 
    { 
     cout << i; 
    } 

    else 
    { 
     cout << new_img << i; 
    } 

} 

// 
//*****************STREAM INSERTIONS*****************// 
// 

istream &operator >> (istream &lhs, Complex &rhs) 
{ 
    char ops; 
    char i = 'i'; 

    lhs >> rhs.real >> ops >> rhs.img >> i;  //lhs is another name for cin 

    if (ops == '-') 
    { 
     rhs.img *= -1; 
    } 

    return lhs; 
} 

ostream &operator << (ostream &lhs, const Complex &rhs) 
{ 
    char ops; 
    char i = 'i'; 
    float new_real = rhs.real; 
    float new_img = rhs.img; 

    if (new_img < 0) 
    { 
     ops = '-'; 
     new_img *= -1; 
    } 

    else if (new_img >= 0) 
    { 
     ops = '+'; 
    } 

    if (new_real == 0) 
    { 

     checkNum(ops, new_img); 

     return lhs << endl; 

    } 

    else if (new_img == 0) 
    { 
     return lhs << new_real; 
    } 

    else if (new_img == 1) 
    { 
     return lhs << new_real << " " << ops << " " << i; 
    } 

    else 
    { 
     return lhs << new_real << " " << ops << " " << new_img << i; 
    } 

    // lhs << rhs.real << " + " << rhs.img << 'i'; 

} 

// 
//***************COMPLEX ARITHMETIC OPERATORS***************// 
//***************** (+ | - | * |/|) ***************** // 
// 

// FORMULA for COMPLEX NUMBERS :: (a + bi) 

Complex operator+(const Complex &lhs, const Complex &rhs) 
{ 

    float a = lhs.getReal(); 
    float b = lhs.getImg(); 

    float c = rhs.getReal(); 
    float d = rhs.getImg(); 

    return Complex(a + c, b + d); 

} 

Complex operator-(const Complex &lhs, const Complex &rhs) 
{ 

    float a = lhs.getReal(); 
    float b = lhs.getImg(); 

    float c = rhs.getReal(); 
    float d = rhs.getImg(); 

    return Complex(a - c, b - d); 

} 


Complex operator*(const Complex &lhs, const Complex &rhs) 
{ 

    float a = lhs.getReal(); 
    float b = lhs.getImg(); 

    float c = rhs.getReal(); 
    float d = rhs.getImg(); 

    return Complex(((a * c) - (b * d)) , ((a * d) + (b * c))); 


} 

Complex operator/(const Complex &lhs, const Complex &rhs) 
{ 

    float a = lhs.getReal(); 
    float b = lhs.getImg(); 

    float c = rhs.getReal(); 
    float d = rhs.getImg(); 

    //Numerator 
    float myReal = (a * c) + (b * d); 
    float myImg = (b * c) - (a * d); 

    //Denominator 
    float myDenom = (pow(c, 2) + pow(d, 2)); 

    return Complex(myReal/myDenom, myImg/myDenom); 

} 

// 
//*****************COMPLEX OPERATORS EQUALS *****************// 
//**************** (+= | -= | *= | /= |) ***************** // 
// 

Complex &Complex::operator+=(const Complex &rhs) 
{ 
    real += rhs.real; 
    img += rhs.img; 

    //*this = *this + rhs; 

    return *this; 
} 

Complex &Complex::operator-=(const Complex &rhs) 
{ 
    real -= rhs.real; 
    img -= rhs.img; 

    return *this; 
} 

Complex &Complex::operator*=(const Complex &rhs) 
{ 
    real *= rhs.real; 
    img *= rhs.img; 

    return *this; 
} 

Complex &Complex::operator/=(const Complex &rhs) 
{ 
    real /= rhs.real; 
    img /= rhs.img; 

    return *this; 
} 


// 
//******************COMPLEX OPERATORS COMPARISON*****************// 
//**************** (== | != | < | <= | > | >= |)*****************// 
// 

bool operator==(const Complex &lhs, const Complex &rhs) 
{ 
    if (lhs.getReal() == rhs.getReal() && lhs.getImg() == rhs.getImg()) 
    { 
     return true; 
    } 

    return false; 
} 

bool operator!=(const Complex &lhs, const Complex &rhs) 
{ 
    return !(lhs == rhs); 
} 

bool operator<(const Complex &lhs, const Complex &rhs) 
{ 
    if (lhs.getReal() < rhs.getReal() || lhs.getReal() == rhs.getReal() && lhs.getImg() < rhs.getImg()) 
    { 
     return true; 
    } 
    return false; 
} 

bool operator<=(const Complex &lhs, const Complex &rhs) 
{ 
    return ((lhs < rhs) || (lhs == rhs)); 
} 

bool operator>(const Complex &lhs, const Complex &rhs) 
{ 
    return !(lhs <= rhs); 
} 

bool operator>=(const Complex &lhs, const Complex &rhs) 
{ 
    return !(lhs < rhs); 
} 

Complex operator-(const Complex &lhs) 
{ 
    return Complex(-lhs); 
} 

メインファイル:

#include <iostream> 
#include "com.h" 
#include <string> 

using namespace std; 

int main() 
{ 
    Complex userValue; 

    cout << "Enter a complex value (a + bi): "; 

    cin >> userValue; 

    cout << "Negated: " << -userValue << endl; 

    cout << "Addition: " << userValue + Complex(0.0, 0.0) << endl; 

    if (Complex(-6, 5.2f) == userValue) 
     cout << "Wow! It's equal." << endl; 

    return 0; 

} 

UPDATE 1:うわー!私はちょうどそれをもう一度試して、実際には、私が入れた数、正と負の笑にクラッシュ!しかし、私は

Complex operator-(const Complex &lhs) 
{ 
    return Complex(-lhs); 
} 

のcppファイルから

ヘッダファイルからメイン

// cout << "Negated: " << -userValue << endl; 

から

Complex operator-(const Complex &lhs); 

...以下のコードをコメントアウトするとき...それはまだなし(作品負の数のコース)

+0

'std :: complex'を認識していますか? –

答えて

4

エラーのように、あなたはあなたのov erloaded関数を再帰的に実行します。代わりに、適切な引数を指定してコンストラクタを呼び出すことができます。

Complex operator-(const Complex &lhs) 
{ 
    return Complex(-lhs.real, -lhs.imag); 
} 
+0

うわー!それは速かった!ありがとう!それは有り難いです! :D – miiworld2

関連する問題