0

我正在尝试使用 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

operator |仅使用 1 个参数是不可能的吗?

4

5 回答 5

7
friend double operator|(const Complex &c1)
{
    return sqrt(c1._real * c1._real + c1._imaginary * c1._imaginary);
}

这没有定义成员运算符,仅供参考。

double magnitude = | c;

这是无效的语法,|是二元运算符。

正确方法:

class Complex
{
   public:
       double _real;
       double _imaginary;

       double getMagnitude() const // POP POP!
       {
           return sqrt(_real * _real + _imaginary * _imaginary);
       }
}

没有更多的奖金。

于 2012-05-29T09:48:01.993 回答
5

|只有1个参数就不可能使用运算符吗?

只要所涉及的类型中至少有一种是用户定义的类型,您就可以重载运算符,但是您不能改变它们可以采用多少参数的行为
由于错误消息告诉您|是二元运算符,您不能重载它以充当一元运算符。

这样做的正确方法是什么?

您应该为您的类提供一个实用函数Complex,并正确命名它,它会以最好的方式为您完成这项工作。

请注意,运算符重载的最基本规则是:
“当运算符的含义不是很清楚且无可争议时,它不应该被重载。相反,提供一个具有良好名称的函数。”
该规则适用于像这样的非直观运算符用法。

于 2012-05-29T09:47:54.107 回答
0

运营商| 是二元运算符。作为二元运算符,它需要 2 个参数。如果你想在这里做你想做的事情,你必须使用一元运算符。

无论如何-这看起来是个坏主意,因为从操作员的角度来看它的作用并不明显。

于 2012-05-29T09:49:40.210 回答
0

不 - '|' 运算符是二元运算符,这意味着它需要两个参数。您可以重载运算符,但不能更改它们的“arity”。不过,一些运算符可用于多个参数。

一元运算符包括:

  • +
  • -
  • ++(前后版本)
  • --(前版和后版)
  • ~
  • *
  • &
  • (cast) (但你必须定义一个合适的铸造类型来得到你的双重结果)

从软件工程的角度来看,最好的解决方案可能是获得模数的显式方法 - 例如 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
于 2012-05-29T09:52:37.577 回答
-1

那是不可能使用运算符 | 只有1个参数?

是的。运营商| 是二元运算符。这意味着它需要两个参数。您正在寻找的是 operator|=

struct wtf
{
    double operator|= (double omg)
    {  
        return 42.;
    }
};

int main(){ wtf omg; omg|=  42.; }
于 2012-05-29T09:51:46.097 回答