Перевантаження оператора% в модуль комплексного числа

Я намагаюся оператор перевантаження для комплексного числа, я реалізував клас, де він приймає в реальній і уявної частини. Я намагаюся перевантажити оператора % , де він повертає значення модуля (довжина реального і уявного), але я отримую помилку "повинно бути рівно один аргумент", Що я роблю неправильно?

Ось мій заголовочний файл

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;

Дякую!

0
% - двійковий оператор.
додано Автор molbdnilo, джерело
Це правильна підпис (з використанням визначення внутрішнього класу): складний оператор% (const complex & other);
додано Автор Ptaq666, джерело
подвійний rm має бути повторно
додано Автор kelalaka, джерело

5 Відповіді

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

3
додано
спасибі! Мені також було цікаво, як би я зробив це, що він виводить тільки зворотну змінну як int замість мого визначеного класу?
додано Автор Andy Lau, джерело

Якщо це ваш оператор модуля, це добре. ви можете дати їй будь-який сенс.

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)) ;
          }
};
3
додано
Де MyClass від, як це допомагає випадку використання ОП?
додано Автор Fire Lancer, джерело
Це навіть не буде компілюватися. Ви забули тип повернення, ви використали неправильне ім'я класу в аргументі operator% , і ви навіть не пояснили, що він зробив неправильно.
додано Автор Ptaq666, джерело
Виправлено його, а також імена змінних.
додано Автор kelalaka, джерело

Оператор '%' - це вбудований двійковий оператор, і ви не можете перевантажити його в C ++. Його використання в C ++ полягає в тому, щоб знайти залишок, коли 2 числа розділені, a% b дасть вам залишок, коли a розділений на b.

Велика спроба, але C + + не дозволить це, наскільки я знаю.

3
додано
C ++ повністю дозволяє оператору перевантажувати, проблема в тому, що вона не дозволяє зробити оператора вгору.
додано Автор George, джерело

Як вже згадувалося, оператор % є двійковим оператором, тому повторне використання його як одинарного модуля неможливе.

Сказавши це, ми можемо зловживати двійковим оператором вільної функції, щоб забезпечити синтаксичний цукор.

Note This answer is for fun and in the spirit of learning. It is not a recommendation of a coding style.

#include 

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
додано

operator% is a binary operator (some, like operator- can be unary or binary).

Це означає, що ви можете визначити його двома різними способами.

  1. As a standalone function

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

  2. As a class member function, in which case the 'left' term is implicitly this

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

Я бачу ще кілька проблем з вашим кодом. Зазвичай в C ++ % означає модуль або залишок. З комплексними числами модуль - це норма , реалізована в abs , і повертає реальне. Думаю, це зрозуміло, особливо коли вирази змішують складні і реальні числа. У вашому операторі модуля ви просто квадратуєте реальні та уявні компоненти. Я не впевнений, що це означає.

0
додано
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147