C++类运算符重载不适用于 std::sort

C++ class operator overloads don't work with std::sort

本文关键字:std sort 适用于 不适用 运算符 重载 C++      更新时间:2023-10-16

,所以我一直在尝试建立一个中位数发电机,该发生器占据分数并生成中位数,但是目前我似乎无法对我自定义的理性number类的向量进行分类。我已经超载了许多操作员( * /==等(,但是当在其他地方向上调用时,它们似乎不起作用。

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 :: Sort Call似乎不起作用或算术。

肯定会错误地超载运算符。例如,此代码将产生意外结果:

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

正确的实现应为:

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

其余方法应相应实施。