C++ 运算符重载"+&引用;对于复杂/双重类型

C++ 运算符重载"+&引用;对于复杂/双重类型,c++,C++,我只把有用的信息放在Complex.cpp中 这是我的问题:我使类变得复杂,这意味着它可以在复杂中计算。 在+操作符中,我想启用complex+double,但只能在main.cpp中使用complex+double。当我使用双变量+复数时,有一个错误。为什么呢?我能修一下吗 复合物 main.cpp 在这种情况下,您应该使用友元函数 friend Complex operator+( const Complex&, const double & ); friend Comple

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

这是我的问题:我使类变得复杂,这意味着它可以在复杂中计算。 在
+
操作符中,我想启用complex+double,但只能在
main.cpp
中使用complex+double。当我使用双变量+复数时,有一个错误。为什么呢?我能修一下吗

复合物 main.cpp
在这种情况下,您应该使用友元函数

friend Complex operator+( const Complex&, const double & );
friend Complex operator+( const double&, const Complex&);
friend Complex operator+( const Complex&, const Complex&);
简单的例子:
$0

要实现这一点,您可以使用
friend
功能。将以下声明添加到类中

friend复数运算符+(常数双精度&,常数复数&)

请注意,这不是类的成员函数,因此实现应如下所示:

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

为了使类显示为右操作数,运算符必须是非成员。由于(在本例中)它需要访问私人成员,因此它必须是朋友:

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;
}

操作符+
本质上是一个函数<代码>x=ss+z类似于
x=ss.operator(z)ss
double
,它内部没有定义
运算符+
。您需要定义一个类外
运算符+
。 你可以像其他答案中建议的那样,在朋友的帮助下完成,但如果没有:

Complex operator+(const double& x, const Complex& c)
{
    return (c + x);
}

定义运算符时,应始终提供完整的集合。对于
operator+
,这还包括
operator+=
,因为用户会假设如果
cmpl=cmpl+1.2
起作用,那么
cmpl+=1.2
也应该起作用。您甚至可以使用助手库(如C++11允许的话)来简化代码。对于
操作员+
,您的代码为:

#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...
};
#包括
阶级情结
:df::可交换的可添加的,
df::可交换的可加<复数,双精度>
{
公众:
复杂(double=0.0,double=0.0);//构造函数
复数运算符+=(常数复数&);//加法
复数&运算符+=(常数双精度&);
//我跳过了剩下的。。。
};

它将自动提供必要版本的
运算符+

定义一个成员函数
运算符+=(常量复数&)
,以及一个非成员函数
运算符+(常量复数&,常量复数)
,使用
运算符+=
进行计算。非成员函数不必是朋友。这是这类事情的常见模式。

我假设这是一个练习,因为如果不是,std::complex中已经有一个complex类。包括它是一个练习,谢谢你提供的信息我想还有一些其他的东西,你所说的运算符+(常数双精度&x,常数复数&c)计算机将作为返回复数(c.real+x,c.virtual);当“+”介于一个双精度和一个复数之间时?好的,那么我应该在.h和复数运算符+中将其作为友元函数,而不是复数::运算符+?非常感谢,我添加了友元复数运算符+(双lhs、常数复数和rhs);进入我的综合体。h和它的工作方式是lhs和rhs键words@user1923431:不,它们不是关键字,只是我通常用于操作符左侧和右侧的名称。你可以叫他们任何你喜欢的名字。
Complex operator+(double lhs, const Complex& rhs) {
    return rhs + lhs;
}
Complex operator+(const double& x, const Complex& c)
{
    return (c + x);
}
#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...
};