C ++运算符与朋友重载

时间:2012-05-29 09:45:11

标签: c++ operator-overloading

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

5 个答案:

答案 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。

一元运营商包括:

  • +
  • -
  • ++(前后版本)
  • - (前后版本)
  • <!/ LI>
  • *
  • &安培;
  • (演员)(但您必须定义合适的演员类型才能获得双倍结果)

从软件工程的角度来看,最好的解决方案可能是获得模数的明确方法 - 例如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.; }