C++ class 运算符重载不适用于 std::sort
C++ class operator overloads don't work with std::sort
所以我一直在尝试构建一个中值生成器,它接受分数并生成中值,但是目前我似乎无法对我自定义的 RationalNumber class 的向量进行排序。我已经重载了许多运算符(* + / == 等),但是当在其他地方调用内联时它们似乎不起作用。
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;
}
所以这里我有一个 class 用来表示带有重载运算符的有理数,这些运算符旨在执行算术运算。但是,当在主要 class 中执行以下操作时:
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 调用似乎不起作用或算术运算。
肯定是运算符重载不正确。例如,这段代码会产生意想不到的结果:
RationalNumber num(1, 1);
num *= 2;
// num is still 1/1
正确的实现应该是:
RationalNumber& RationalNumber::operator*(int x)
{
numerator *= x;
reduceFraction();
return *this;
}
其余的方法应该相应地实现。
所以我一直在尝试构建一个中值生成器,它接受分数并生成中值,但是目前我似乎无法对我自定义的 RationalNumber class 的向量进行排序。我已经重载了许多运算符(* + / == 等),但是当在其他地方调用内联时它们似乎不起作用。
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;
}
所以这里我有一个 class 用来表示带有重载运算符的有理数,这些运算符旨在执行算术运算。但是,当在主要 class 中执行以下操作时:
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 调用似乎不起作用或算术运算。
肯定是运算符重载不正确。例如,这段代码会产生意想不到的结果:
RationalNumber num(1, 1);
num *= 2;
// num is still 1/1
正确的实现应该是:
RationalNumber& RationalNumber::operator*(int x)
{
numerator *= x;
reduceFraction();
return *this;
}
其余的方法应该相应地实现。