2

この初心者を助けてください、これが私のコードです:

#include <iostream>
using namespace std;

class Complex {
private:
    float r, i;

public:
    Complex(float rr, float ii) : r(rr), i (ii) {}
    float GiveRe () { return r; }
    float GiveIm () { return i; }
    void Setit (float rr, float ii) {
        r = rr;
        i = ii;
    }
};

Complex a(10, 20);

Complex sumit (Complex &ref) {
     static Complex sum (0, 0);
    sum.Setit(sum.GiveRe() + ref.GiveRe(), sum.GiveIm() + ref.GiveIm());
    return sum;
}

int main () {
    Complex sumvalue = sumit (a);
    cout << sumvalue << endl;
    return 0;
}

エラー: no match for 'operator<<' in 'std::cout << sumvalue'

プログラムは複素数の合計を出力する必要があります。

4

5 に答える 5

2

cout は出力したいものを伝えることができません。クラスで operator<< を指定するか、クラスを互換性のある型に暗黙的に変換できるようにする必要があります。

http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/

クラスに実装された Rudolf Mühlbauer のコード:

これをクラス ヘッダー内のどこかに追加します。

friend ostream& operator<<(ostream& out, const Complex& compl);

そしてこれはヘッダーの下にあります:

ostream& operator<<(ostream& out, const Complex& compl)
{
    return out << compl.r << "/" << compl.i;
}

実装は、正確なニーズに合わせて変更する必要があります。

于 2012-10-13T20:30:31.137 に答える
1

複合体には演算子 << がありません

ostream& Complex::operator << ( ostream& os )
    {
    // use os << field/method here to out put
    return os;
    }

また、複合体をさまざまな方法でコンソールに表示できる場合は、 cout << の代わりにメソッドを使用して表示することを検討する必要があります

void Complex::DisplayToConsole()
    {
    std::cout << r << " " << i << '\n';
    }
于 2012-10-13T20:29:56.917 に答える
1

"<<"複合型の演算子をオーバーロードする必要があります。

#include <iostream>
using namespace std;

class Complex {
private:
    float r, i;

public:
    Complex(float rr, float ii) : r(rr), i (ii) {}
    float GiveRe () { return r; }
    float GiveIm () { return i; }
    void Setit (float rr, float ii) {
        r = rr;
        i = ii;
    }

};

ostream& operator<<(ostream& os, Complex& c)
    {
        float i;
        os<<c.GiveRe();
        if(c.GiveIm() < 0){  
            os<<"-j"<<c.GiveIm()*(-1);
        }else{
            os<<"+j"<<c.GiveIm();
        }
        return os;
    }

Complex a(10, 20);

Complex sumit (Complex &ref) {
     static Complex sum (0, 0);
    sum.Setit(sum.GiveRe() + ref.GiveRe(), sum.GiveIm() + ref.GiveIm());
    return sum;
}

int main () {
    Complex sumvalue = sumit (a);
    cout << sumvalue << endl;
    return 0;
}
于 2012-10-13T20:33:50.313 に答える
1

完全な最小限の例:

#include <iostream>

using namespace std;

class C {
  public: 
    int r, l;
    // if the operator needs access to private fields:
    friend ostream& operator<< (ostream&, const C&);
};

ostream& operator << (ostream& stream, const C& c) {
    stream << c.r << "--" << c.l;
    return stream;
}

int main() {
    C c;
    c.l = 1;
    c.r = 2;
    cout << c << endl;
}

C++ では、演算子を定義できます。STL は<<演算子を出力に使用し、istream/ostream クラス階層全体がこの演算子を使用して入出力します。

演算子は関数として実装されますが、常に特定の構文に従います。例ostream& operator << (ostream&, const MYTYPEHERE&)のように、ostream<<演算子を定義する方法です。

C++ がステートメントに遭遇すると、すべてのオペランドの型を推測し、(実際には非常に魔法のように) 質問に対する解決策を見つける必要があります。

これらのオブストリーム演算子は、 のどこかにあるすべての基本型に対して定義されている<iostream>ため、 と記述するcout << 10と、コンパイラは演算子を見つけますostream& operator<< (ostream&, int)

このゲームでユーザー定義型を使用できるようにするには、演算子を定義する必要があります。そうしないと、ステートメントcout << sometypeは無効になります。これは、C++ で時々見られる厳しいコンパイラ エラーの理由でもあります。

タイプに演算子を実装するのは好ましくない場合があるため (たとえば、一度だけ出力する場合)、次のように書くことをお勧めします。

cout << sum.re << "--" << sum.im << endl; // or similar

このようにして、記述するコードが少なくなり、出力形式が柔軟になります。次回は複素数を別の形式にするかどうかは誰にもわかりません。しかし、これは別の議論です。

なぜそんなに複雑なのですか?C++ は非常に複雑になる可能性があるためです。非常に強力ですが、特殊な構文とそれらの例外がぎっしり詰まっています。結局のところ、C との違いはまさにここにあります。C++ は型推論 (テンプレートに必要) ではるかに優れた仕事をし、多くの場合 WTF? になります。

コードに実装する方法については、他の回答が良い解決策を提供すると思います!

于 2012-10-13T20:35:31.220 に答える
0

sumit(a)は、処理するように定義されていないComplextypeのオブジェクトを返します。cout

于 2012-10-13T20:31:28.413 に答える