2

Complex.cpp には有益な情報だけを入れています。

これが私の問題です。クラスを複雑にしました。これは、複雑に計算できることを意味します。演算子でcomplex + doubleを有効にしたいの+ですが、complex + doubleではしか使えませんmain.cpp。double 変数 + complex を使用すると、エラーが発生します。何故ですか?直せますか?

複雑な.h

#ifndef COMPLEX_H
#define COMPLEX_H
using namespace std;
class Complex
{
public:
    Complex( double = 0.0, double = 0.0 ); // constructor
    Complex operator+( const Complex & ) const; // addition
    Complex operator-( const Complex & ) const; // subtraction
    Complex operator*( const Complex & ) const; // mul
    bool operator==( const Complex & ) const;
    bool operator!=( const Complex & ) const;
    friend ostream &operator<<( ostream & , const Complex& ); 
    friend istream &operator>>( istream & , Complex& );
    Complex operator+( const double & ) const;
    //Complex &operator+( const double & ) const;
    void print() const; // output
private:
    double real; // real part
    double imaginary; // imaginary part
}; // end class Complex

#endif

コンプレックス.cpp

Complex Complex::operator+( const Complex &operand2 ) const
{
    return Complex( real + operand2.real,imaginary + operand2.imaginary );
} // end function operator+

Complex Complex::operator+(const double &operand2) const
{
    return Complex( real + operand2 , this->imaginary );
}

main.cpp

int main()
{
Complex x;
Complex y( 4.3, 8.2 );
Complex z( 3.3, 1.1 );

    double ss = 5;
    x = z + ss;
    x = ss + z;//this syntax is illegal 
4

6 に答える 6

3

クラスが右側のオペランドとして表示されるようにするには、演算子が非メンバーである必要があります。(この場合) プライベート メンバーにアクセスする必要があるため、フレンドである必要があります。

class Complex {
    // ...
    friend Complex operator+(double lhs, const Complex & rhs);
};

Complex operator+(double lhs, const Complex & rhs) {
    return Complex(lhs+rhs.real, rhs.imaginary);
}

または、引数を逆に取るメンバーが既にあり、加算が対称であるため、非メンバー、非フレンド関数を定義できます。

Complex operator+(double lhs, const Complex& rhs) {
    return rhs + lhs;
}
于 2013-04-01T10:32:15.250 に答える
1

この場合、フレンド関数を使用する必要があります。

friend Complex operator+( const Complex&, const double & );
friend Complex operator+( const double&, const Complex&);
friend Complex operator+( const Complex&, const Complex&);

簡単な例: http://liveworkspace.org/code/A14xS $0

于 2013-04-01T10:28:23.653 に答える
0

演算子を定義するときは、常に完全なセットを提供する必要があります。の場合operator+、これには も含まれます。これは、ユーザーが動作する場合は動作operator+=するはずであると想定するためです。Boost.Operatorsや、C++11 が許可されている場合は my df.operatorsなどのヘルパー ライブラリを使用して、コードを簡素化することもできます。の場合、コードは次のようになります。cmpl = cmpl + 1.2cmpl += 1.2operator+

#include <df/operators.hpp>

class Complex
  : df::commutative_addable< Complex >,
    df::commutative_addable< Complex, double >
{
public:
    Complex( double = 0.0, double = 0.0 ); // constructor
    Complex& operator+=( const Complex & ); // addition
    Complex& operator+=( const double & );

    // I skipped the rest...
};

の必要なバージョンが自動的に提供されますoperator+

于 2013-04-01T10:44:16.807 に答える
0

メンバー関数 と、計算を行うために使用operator+=(const Complex&)する非メンバー関数を定義します。非メンバー関数は、フレンドである必要はありません。これは、この種の通常のパターンです。operator+(const Complex&, const Complex)operator+=

于 2013-04-01T13:11:04.670 に答える
0

これを実現するには、friend関数を使用できます。次の宣言をクラスに追加します

friend Complex operator+(const double&, const Complex&)

これはクラスのメンバー関数ではないことに注意してください。したがって、実装は次のようにする必要があります。

Complex operator+(const double& x, const Complex& c)
{
    return Complex(c.real + x, c.imaginary);
}
于 2013-04-01T10:30:44.653 に答える