我正在尝试使用C ++实现参数重载:
Complex c(3.0, 4.0);
double magnitude = | c; // magnitude will be 5
我写了以下代码:(这里只有必要的部分..)
class Complex
{
public:
double _real;
double _imaginary;
friend double operator|(const Complex &c1)
{
return sqrt(c1._real * c1._real + c1._imaginary * c1._imaginary);
}
}
但是我收到以下错误:
error C2805: binary 'operator |' has too few parameters
仅使用1个参数就不可能使用operator |
吗?
答案 0 :(得分:7)
friend double operator|(const Complex &c1)
{
return sqrt(c1._real * c1._real + c1._imaginary * c1._imaginary);
}
这不定义成员运营商,只是FYI。
double magnitude = | c;
这是无效的语法,|
是二元运算符。
class Complex
{
public:
double _real;
double _imaginary;
double getMagnitude() const // POP POP!
{
return sqrt(_real * _real + _imaginary * _imaginary);
}
}
没有额外奖金。
答案 1 :(得分:5)
仅使用1个参数就不可能使用运算符
|
吗?
只要涉及的类型中的至少一个是用户定义的类型,您就可以重载运算符,但是您无法更改行为w.r.t它们可以采用多少参数。
由于错误消息告诉您|
是二元运算符,因此您不能将其重载以充当一元运算符。
这样做的正确方法是什么?
您应该为您的班级Complex
提供实用程序功能,并对其进行适当命名,并以最佳方式为您完成工作。
请注意,运算符重载的最基本规则是:
"Whenever the meaning of an operator is not obviously clear and undisputed, it should not be overloaded. Instead, provide a function with a well-chosen name."
该规则适用于非直观的操作员使用。
答案 2 :(得分:0)
运算符|是一个二元运算符。作为二元运算符,它需要2个参数。如果你想在这里做你想做的事,你必须使用一元运算符。
无论如何 - 这看起来是个坏主意,因为从操作员那里看它的作用并不明显。
答案 3 :(得分:0)
不 - '|' operator是一个二元运算符,意味着它需要两个参数。您可以重载运算符但不能更改它们的“arity”。有些运营商可以使用多个arities。
一元运营商包括:
从软件工程的角度来看,最好的解决方案可能是获得模数的明确方法 - 例如getModulus()。但你可以合理地争辩说双击是可以的。
对于后一种情况,您将拥有:
class Complex
{
public:
double _real;
double _imaginary;
operator double() const
{
return sqrt(this._real * this._real + this._imaginary * this._imaginary);
}
}
并按如下方式使用:
Complex c(3.0, 4.0);
double magnitude = c; // magnitude will be 5
答案 4 :(得分:-1)
这是不可能使用operator |只有一个参数?
是。运营商|是一个二元运算符。这意味着它需要两个参数。你要找的是operator | =
struct wtf
{
double operator|= (double omg)
{
return 42.;
}
};
int main(){ wtf omg; omg|= 42.; }