我试图对一个复数进行运算符重载,我实现了一个包含实部和虚部的类。我正在尝试重载%
运算符,并在该运算符处返回模数值(实数和虚数的长度),但是却出现错误“必须正好接受一个参数”,我在做什么错?
这是我的头文件
complex.h
class complex{
private:
double rm;
double im;
public:
void operator % ();
complex.cpp
void operator %(){
complex c;
c.re = pow(re,2);
c.im = pow(im,2);
return c;
谢谢!
答案 0 :(得分:3)
C ++中的'%'运算符是二进制运算符,例如a % b
,但是您试图像一元运算符一样使用它。 C ++允许您重载现有运算符的实现,但不能添加新运算符或更改使用现有运算符的方式。
答案 1 :(得分:0)
operator%
是一个二进制运算符(例如operator-
可以是一元或二进制)。
这意味着您可以用两种不同的方式对其进行定义。
作为独立功能
complex operator%(const complex& left, const complex& right);
作为类成员函数,在这种情况下,“ left”一词暗含着这种作用
complex& complex::operator%(const complex& right);
我发现您的代码还有其他问题。通常在C ++中,%
是指模数或余数。对于复数,模数是在abs
中实现的norm,并且它返回实数。我想这是为了使情况更清楚,特别是当存在混合了实数和实数的表达式时。在模运算符中,您只需要对实部和虚部进行平方。我不确定这是什么意思。
答案 2 :(得分:0)
如前所述,%
运算符是二进制运算符,因此无法将其用作一元模。
话虽如此,我们可以滥用自由函数二进制运算符来提供语法糖。
注意这个答案很有趣,而且本着学习的精神。这不是推荐的编码样式。
#include <cmath>
struct imperative_mode_sentinel {};
struct complex
{
complex(double rm, double im) : rm(rm), im(im) {}
double rm, im;
complex modulus() const
{
return complex(std::pow(rm, 2), std::pow(im, 2));
}
};
auto operator%(imperative_mode_sentinel, complex const& r) -> complex
{
return r.modulus();
}
constexpr static auto imperative_mode = imperative_mode_sentinel();
int main()
{
auto c = complex(1,1);
auto d = imperative_mode %c; // equivalent to d = c.modulus()
}
答案 3 :(得分:-3)
如果这是您的模运算符,那很好。您可以根据需要赋予它任何含义。 See;
除上述限制外,该语言别无其他 对重载运算符的作用或返回类型的约束 (它不参与重载解析),但通常来说, 重载运算符的行为应尽可能类似于 内置运算符
class complex{
private:
double rm;
double im;
public :
complex(int i, int r) {
re = r; im = i;
}
complex operator%(const complex& mc){//for complex
return complex(pow(re,2),pow(im,2)) ;
}
};