Определение специального деления между целыми числами - PullRequest
2 голосов
/ 24 сентября 2019

Я реализовал поле рациональных чисел и операторы (+, *, -, /) и (==,>, <) для этого поля в C ++.Это было просто, я создал для этого класс рациональный. </p>

Я также добавил математические операторы (+, *, -, /) и (==,>, <) для операций между дробями ицелые числа.В моем коде любая операция между целым и рациональным результатом приводит к рациональному.</p>

У меня проблемы с последним этапом: я хочу создать альтернативный оператор деления |на целые числа, так что int a |int b = рациональный (a, b).Как это можно сделать в C ++?Проблема в том, что я не знаю, как добавить какие-либо методы в «класс целых чисел», я не знаю, как этот «скрытый» класс можно редактировать.Если бы я мог это сделать, я бы просто добавил метод

rational operator | (int x){
rational temp;
temp.numerator=value;
temp.denominator=x.value;
temp.reduce();
return temp;
}

в целочисленный класс.Где я назвал переменную класса целочисленного значения класса.И использовал мой существующий метод сокращения из рационального класса.

Ответы [ 5 ]

4 голосов
/ 24 сентября 2019

Прежде всего, я бы посоветовал не делать этого, потому что operator | обычно не имеет этого побочного эффекта.Перегрузка оператора таким образом нарушает правило № 2 в этих общих правилах перегрузки операторов.

Хорошо, с нашей точки зрения, C ++ не позволяет вам перегружать операторы для интегральных данныхтипы.Это может привести к поломке кода, если они это сделают.

Однако вы можете перегружать операторы рациональными значениями.Вы можете сделать это примерно так:

class rational {
    rational operator|(rational other) {
        return rational(this->numerator, other.numerator);
    }
};

Затем вы можете создать несколько конструкторов, таких как:

class rational {
    // I'm assuming you have something like this for the implementation of operator| to work
    rational(int n, int d) {
        this->numerator = n;
        this->denominator = d;
    }
    // This constructor creates a rational by putting everything over 1
    // This will function the same mathematically as the number itself
    rational(int n) {
        this->numerator = n;
        this->denominator = 1; // a single number is put over 1
    }

};

Теперь вы можете использовать operator| следующим образом:

rational r = rational(5) | 7;

Что, кажется, близко к тому, что вы хотите.


Примечание: Когда вы доберетесь до здесь, если вы сделаете рациональные решения, примите одно число в конструктореи положив его на 1, вы можете осознать, что вам не нужен специальный operator|, чтобы создать рациональный способ.Если ваша рациональная реализация реализует деление с использованием умножения на обратную величину, вы можете просто сделать это вместо этого:

rational r = rational(5) / 7;

Что намного яснее, что вы собираетесь делать в любом случае.

2 голосов
/ 24 сентября 2019

Вы не можете: если бы вы могли изменить поведение и набрать выражения a | b для int a и int b, тогда можете ли вы представить себе ад, который будет выпущен?

К счастью, нотация rational temp{a, b} не на расстоянии в миллион миль от того, что вы хотели (предполагая, что ваш класс rational имеет члены числителя и знаменателя в этом порядке), и, учитывая стандарт C ++, он также читабелен.

2 голосов
/ 24 сентября 2019

Я не знаю, как этот "скрытый" класс можно редактировать.

Не существует "скрытого" класса для целых чисел.int и другие целочисленные типы вообще не являются классами;и невозможно перегрузить их арифметические операторы.

Проблема в том, что я не знаю, как добавить какие-либо методы в "класс целых чисел",

Первым шагом, конечно, является создание класса для целых чисел.Так же, как вы создали класс для рациональных.

1 голос
/ 24 сентября 2019

Вы не можете, как говорилось в другом бритье.

Но то, что вы могли бы легко сделать, это принять, что Rational(int dividend) генерирует dividend/1.

Тогда пользователь может легко написать Rational(dividend)/divisor, который вы / можете / перегрузить.Вы должны решить, лучше ли это, чем Rational(dividend,divisor).Конечно, они могут также написать dividend/Rational(divisor), и вы также можете перегрузить это, если хотите.

0 голосов
/ 24 сентября 2019

Как сказано в комментариях, вы не можете перегружать встроенные типы.

Что вы можете сделать: Оберните свое целое число в новый класс, где вы перегружаете операторы этого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...