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