重载运算符 < , == 对于分数类型
Overload operator < , == for a fraction type
我正在尝试重载运算符<在C++中。到目前为止,我只做了+、-、*、/。我拿出了这个代码:
Fraction Fraction::operator/(Fraction &second)
{
int n1 = getNumerator() * second.getDenominator();
int n2 = second.getNumerator() * getDenominator();
int d = getDenominator() * second.getDenominator();
return Fraction(n1/n2, d);
}
bool Fraction::operator<(Fraction &second)
{
if(numerator < second.numerator)
{
return true;
}
else if(denominator < second.denominator)
{
return true;
}else
{
return false;
}
}
我想知道我应该如何修改它,以便使运算符<,==过载?我需要一个布尔方法类型,这是我所知道的,但我不知道要比较。提前谢谢。
我不知道要比较
利用
(a / b) < (c / d) ←→ (a * d) < (c * b) if b * d > 0
(a / b) < (c / d) ←→ (a * d) > (c * b) if b * d < 0
(假设没有发生溢出)
它非常简单。(一条建议:如果操作员不修改对象,请使用const引用…)
bool Fraction::operator<(const Fraction &that) const
{
unsigned long long num1 = this->num * that.denom;
unsigned long long num2 = that.num * this->denom;
return num1 < num2;
}
bool Fraction::operator==(const Fraction &that) const
{
// I'm too lazy to do more maths, so I cheat
return !(*this < that || that < *this);
}
请注意,这并不涉及有符号的数字(显然),这只是一个练习。
注意:我最初的答案并不完美,并处理了许多假设,主要是分母不会为零,这可以通过类成员setter强制执行。setter还可以用于强制分母为正(通过将符号推到分子上)。一旦分母被强制严格地大于零,operator<
就可以优雅地写成(参见johnchen的回答,其中b * d > 0
):
bool Fraction::operator<(const Fraction &second) const
{
return getNumerator() * second.getDenominator() < second.getNumerator() * getDenominator();
}
这里唯一剩下的风险是溢出,如果分子和分母使用的数据类型为int32_t
或更小,则可以强制此计算中使用的数据类别为int64_t
以消除此风险。
原始(低质量)接受答案:
bool Fraction::operator<(const Fraction &second) const
{
return (float(getNumerator() ) / getDenominator() < float(second.getNumerator() ) / second.getDenominator() )
}
事实上,您可能应该有一个const方法getFloatingValue
,它返回float(getNumerator() ) / getDenominator()
:这将简化其他比较函数的编写。
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- JS相等运算符(如===)是否可以使用embind类型
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 将所有模板类型传递给运算符,而不指定所有类型
- 标准库类型的赋值运算符的引用限定符
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 如何确保接受的C++模板类型使运算符重载?
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- C2679 二进制"<<":未找到采用右操作数类型的运算符
- 使用类型id运算符的最佳替代方法
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- int* 和 int[] 类型对二进制运算符 + 的操作数无效
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 运算符'<'不能应用于类型 'string' 和 'string' 的操作数
- 为什么重载运算符可以返回其返回类型以外的其他内容?
- 表达式必须具有类类型(运算符)
- 使用许多类型运算符过载时,模棱两可的超载
- 类型转换为类型&&运算符
- 返回类型 ?:运算符和 C++ Primer 中的措辞
- 返回类型与返回类型(运算符++)不相同,也不协变