【发布时间】:2019-10-03 07:31:24
【问题描述】:
所以我一直在尝试构建一个中值生成器,它接收分数并生成中值,但是目前我似乎无法对我自己定义的 RationalNumber 类的向量进行排序。我已经重载了一些运算符( * + / == 等),但是在其他地方内联调用时它们似乎不起作用。
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 调用或算术似乎不起作用,因此运算符重载似乎不起作用。
【问题讨论】:
-
您正在对指针进行排序..
std::vector<RationalNumber*>,将比较器作为std::sort的第三个参数传递,您可以在其中取消引用RationalNumber 并为它们使用operator<。 -
有什么理由将指针存储在向量中而不是有理数本身?
-
当您遵循此处给出的建议并让向量自己保存对象时,请确保您的代码 const 正确。
bool RationalNumber::operator<(const RationalNumber& r)- 这里r是 const,这很好,但左侧 (this) 不是。您需要对成员函数bool RationalNumber::operator<(const RationalNumber& r) const进行 const 限定。 -
operator<应该是const,你的许多其他运营商也应该如此 -
“似乎”是含糊的。你到底看到了什么?你是怎么得出这个结论的?
标签: c++ sorting operator-overloading operators std