簡體   English   中英

運算符將%重載為復數模

[英]Operator overloading % into the modulus of complex number

我正在嘗試對一個復雜的數字進行運算符重載,我實現了一個包含實部和虛部的類。 我正在嘗試在%運算符上重載它返回模數值(實數和虛數的長度),但是我收到錯誤消息“必須正好接受一個參數”,我在做什么錯?

這是我的頭文件

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;

謝謝!

C ++中的'%'運算符是二進制運算符,類似於a % b ,但是您試圖像一元運算符一樣使用它。 C ++允許您重載現有運算符的實現,但不能添加新運算符或更改使用現有運算符的方式。

operator%是二進制運算符(某些運算符(如operator-可以是一元或二進制))。

這意味着您可以用兩種不同的方式定義它。

  1. 作為獨立功能

    complex operator%(const complex& left, const complex& right);

  2. 作為類成員函數,在這種情況下,“ left”一詞暗含

    complex& complex::operator%(const complex& right);

我發現您的代碼還有其他問題。 一般在C ++ %表示模數或余數。 對於復數,模是以abs為單位的范數 ,它返回實數。 我想這是為了使情況更清楚,特別是當存在混合了實數和實數的表達式時。 在模運算符中,您只需要對實部和虛部進行平方。 我不知道這是什么意思。

如前所述, %運算符是二進制運算符,因此不可能將其用作一元模數。

話雖如此,我們可以濫用自由函數二進制運算符來提供語法糖。

注意此答案是出於娛樂目的和本着學習的精神。 這不是編碼風格的建議。

#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()
}

如果這是您的模數運算符,那很好。 您可以根據需要賦予它任何含義。 ;

除了上述限制之外,該語言對重載運算符的操作或返回類型(返回類型(不參與重載解析))沒有任何其他限制,但是通常,重載運算符的行為應盡可能與重載運算符相似。內置運算符

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)) ;
          }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM