Перегрузки операторов класса C ++ не работают с std :: sort - PullRequest
0 голосов
/ 16 мая 2019

Итак, я пытался создать медианный генератор, который принимает дроби и генерирует медиану, однако, похоже, что в настоящее время я не могу отсортировать вектор своего собственного определяемого класса RationalNumber.Я перегружен рядом операторов (* + / == и т. Д.), Однако они не работают при вызове inline в другом месте.

RationalNumber RationalNumber::operator*(const RationalNumber& r)
{
    RationalNumber result(numerator * r.numerator, denominator * r.denominator);
    result.reduceFraction();
    return result;
}   

RationalNumber RationalNumber::operator*(int x)
{
    RationalNumber result(numerator * x, denominator);
    result.reduceFraction();
    return result;
}

RationalNumber RationalNumber::operator/(const RationalNumber& r)
{
    RationalNumber result(numerator * r.denominator, denominator * r.numerator);
    result.reduceFraction();
    return result;
}

RationalNumber RationalNumber::operator/(int x)
{
    RationalNumber result(numerator, denominator * x);
    result.reduceFraction();
    return result;
}
bool RationalNumber::operator<(const RationalNumber& r)
{
    if(this->floatingPoint < r.floatingPoint)
    {
        return true;
    }

    return false;
}

bool RationalNumber::operator<(int x)
{
    if(floatingPoint < (double) x)
    {
        return true;
    }

    return false;
}

bool RationalNumber::operator>(const RationalNumber& r)
{
    if(floatingPoint > r.floatingPoint)
    {
        return true;
    }
    return false;
}

bool RationalNumber::operator>(int x)
{
    if(floatingPoint > (double) x)
    {
        return true;
    }
    return false;
}

RationalNumber RationalNumber::operator+(const RationalNumber& r)
{
    RationalNumber result((numerator * r.denominator)+(r.numerator*denominator),denominator * r.denominator);
    result.reduceFraction();
    return result;
}

RationalNumber RationalNumber::operator+(int x)
{
    RationalNumber result(numerator * x,denominator);
    return result;
}

Так что здесь у меня есть класс, который должен представлятьрациональные числа с перегруженными операторами, предназначенные для проведения арифметики.Однако, когда в основном классе выполняется следующее:

RationalNumber medianCalculator(std::vector<RationalNumber*> &listOfRationalNumbers)
{
    std::sort(listOfRationalNumbers.begin(),listOfRationalNumbers.end());
    if(!(listOfRationalNumbers.size() % 2)){
        return ((RationalNumber(*listOfRationalNumbers.at((listOfRationalNumbers.size()/2) +1)) + (RationalNumber(*listOfRationalNumbers.at(listOfRationalNumbers.size()/2))) / 2));
    } else {
        return RationalNumber(*listOfRationalNumbers.at(listOfRationalNumbers.size() +1));
    }
}

Во-первых, кажется, что он генерирует исключение вне диапазона, но, что более важно, кажется, что перегрузка оператора не работает как std ::вызов сортировки, похоже, не работает или арифметика.

1 Ответ

1 голос
/ 17 мая 2019

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

RationalNumber num(1, 1);
num *= 2;
// num is still 1/1

Правильная реализация должна быть:

RationalNumber& RationalNumber::operator*(int x)
{
    numerator *= x;
    reduceFraction();
    return *this;
}

Остальные методы должны быть реализованы соответствующим образом.

...