Перегрузка оператора% в модуль комплексного числа - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь перегрузить оператор для комплексного числа, я реализовал класс, где он принимает действительную и мнимую части.Я пытаюсь перегрузить оператор %, где он возвращает значение модуля (длина действительного и мнимого), но я получаю сообщение об ошибке «должен принять ровно один аргумент». Что я делаю неправильно?

Вот мой заголовочный файл

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;

Спасибо!

Ответы [ 4 ]

0 голосов
/ 01 октября 2018

Как уже упоминалось, оператор % является бинарным оператором, поэтому переназначить его как унарный модуль невозможно.

Сказав, что мы можем злоупотреблять бинарным оператором свободной функции, чтобы обеспечить синтаксический сахар.

Примечание Этот ответ для развлечения и в духе обучения.Это не рекомендация стиля кодирования.

#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()
}
0 голосов
/ 01 октября 2018

Оператор '%' в C ++ является бинарным оператором, например a % b, но вы пытаетесь использовать его как унарный.C ++ позволяет вам перегружать реализацию существующих операторов, но не добавлять новые или изменять способ использования существующих.

0 голосов
/ 01 октября 2018

operator% - бинарный оператор (некоторые, например, operator- могут быть унарными или двоичными).

Это означает, что вы можете определить его двумя различными способами.

  1. в качестве отдельной функции

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

  2. В качестве функции-члена класса, в этом случае «левый» термин неявно равен

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

Я вижу еще несколько проблем с вашим кодом.Обычно в C ++ % означает модуль или остаток.С комплексными числами модуль - это норма , реализованная в abs, и она возвращает действительное число.Я предполагаю, что это должно сделать вещи более ясными, особенно когда есть выражения, которые смешивают сложные и реальные числа.В вашем операторе модуля вы просто возводите в квадрат действительные и мнимые компоненты.Я не уверен, что это должно означать.

0 голосов
/ 01 октября 2018

Если это ваш оператор модуля, это нормально.Вы можете придать этому значение, какое захотите. См. ;

Кроме ограничений, указанных выше, язык не накладывает никаких других ограничений на то, что делают перегруженные операторы, или на тип возвращаемого значения (он не участвует в разрешении перегрузки)но, как правило, перегруженные операторы должны вести себя как можно более похожими на встроенные операторы

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)) ;
          }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...