2

我只将有用的信息放在 Complex.cpp 中。

这是我的问题:我使类变得复杂,这意味着它可以进行复杂的计算。在+运算符中我想启用 complex + double,但我只能使用 complex + double in main.cpp。当我使用双变量+复数时出现错误。这是为什么?我可以修复它吗?

复杂的.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 );
}

主文件

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 回答
2

operator+本质上是一个函数。x = ss + z;类似于x = ss.operator(z);But ssis double,内部没有operator+定义。您需要定义一个 out-of-class operator+friend您可以在其他答案中建议的类似帮助下做到这一点,但如果没有:

Complex operator+(const double& x, const Complex& c)
{
    return (c + x);
}
于 2013-04-01T10:34:22.527 回答
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

为此,您可以使用一个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 回答
0

定义运算符时,应始终提供完整的集合。对于operator+,这也包括operator+=,因为用户会假设如果cmpl = cmpl + 1.2有效,那么cmpl += 1.2也应该有效。您甚至可以使用Boost.Operators 之类的帮助程序库,或者,如果允许使用 C++11,还可以使用我的df.operators来简化代码。对于operator+,您的代码将是:

#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 回答