演算子のオーバーロードを使用して複素数を実装しています。プログラムでは、ユーザーは常に次の形式で複素数を入力します。
a + bi
では、例えば…
25.0 + 3.6i
ユーザーは常に複素数の実部と虚部の両方を入力すると仮定します。たとえば、ユーザーは「5 + 0i」(「5」ではなく) または「0 - 6.2i」(「-6.2」ではなく) を入力します。私")。
私の問題は、main() に次のコードがあることです。
ComplexNumber c1;
cin >> c1;
cout << c1;
コードは次のように表示されます。
0 + 0i
...実行時にプロンプトに「4.2 + 8.3i」と入力したとき。
これが私のoperator>>
クラスの実装です:
istream & operator>>(istream & in, ComplexNumber & n) {
string real;
string imag;
bool done = false;
int sign = 1;
string num;
in >> num;
int length;
for (int i = 0; i < num.length(); i++) {
if (num.at(i) == 'i') {
imag = num.substr((i - length), i);
}
else if (num.at(i) == '-') {
sign = -1;
}
else if (num.at(i) == ' ') {
if (!done) {
real = num.substr(i);
done = true;
}
length = 0;
}
length++;
}
n = ComplexNumber(atof(real.c_str()), atof(imag.c_str()) * sign);
return in;
}
operator<<
クラスの私の実装は次のとおりです。
ostream & operator<<(ostream & out, const ComplexNumber & n) {
n.print(out);
return out;
}
以下は、ComplexNumber メンバー クラス print() の実装です。
void ComplexNumber::print(ostream & out) const {
if (imag >= 0)
out << real << " + " << imag << "i";
else
out << real << " - " << (-1 * imag) << "i";
}
詳細については、これが私の ComplexNumber ヘッダー ファイルです。
#ifndef COMPLEXNUMBER_H
#define COMPLEXNUMBER_H
#include <iostream>
using namespace std;
class ComplexNumber {
public:
// constructors
ComplexNumber();
ComplexNumber(double real_part, double imaginary_part);
ComplexNumber(const ComplexNumber & rhs);
// named member functions
void print(ostream & out = cout) const;
bool equals(const ComplexNumber & rhs) const;
// assignment operators
const ComplexNumber & operator=(const ComplexNumber & rhs);
const ComplexNumber & operator+=(const ComplexNumber & rhs);
const ComplexNumber & operator-=(const ComplexNumber & rhs);
const ComplexNumber & operator*=(const ComplexNumber & rhs);
private:
double real;
double imag;
};
// arithmetic operators
ComplexNumber operator+(const ComplexNumber & lhs, const ComplexNumber & rhs);
ComplexNumber operator-(const ComplexNumber & lhs, const ComplexNumber & rhs);
ComplexNumber operator*(const ComplexNumber & lhs, const ComplexNumber & rhs);
// relational operators
bool operator==(const ComplexNumber & lhs, const ComplexNumber & rhs);
bool operator!=(const ComplexNumber & lhs, const ComplexNumber & rhs);
// I/O operators
ostream & operator<<(ostream & out, const ComplexNumber & n);
istream & operator>>(istream & in, ComplexNumber & n);
#endif
私の実装に関する助けは素晴らしいでしょう。