我班的等号运算符(==)不起作用
我一直在遵循一些cpp练习来学习cpp,而我遇到了一个问题。
我创建了一个名为“FixedPoint2”的类来实现2位小数的定点数。 我已经包含了包含以下所有功能的头文件。
我所苦苦挣扎的是,当我试图检验平等运算符时,我总是得到一个错误的答案。 换句话说,会发生以下情况:
cout << (FixedPoint2(1.0)==FixedPoint2(1.0)) << endl; //returns true as expected
cout << (FixedPoint2(1.2)==FixedPoint2(1.2)) << endl; //returns false
cout << FixedPoint2(1.2) << "t" << FixedPoint2(1.2) << endl; returns 1.2 1.2
所以你明白了。 我还用if语句对它进行了测试,以确保我的重载呼叫不是问题。 例如:
if (FixedPoint2(4.5)==FixedPoint2(4.5))
cout << "Don't post to stackoverflow"; //This doesn't print
我的直觉告诉我,有些隐含的类型转换可能会导致我忽略了一些隐藏的类型转换,或者是一些混乱的东西。 但我不认为这是其中之一。
using namespace std;
class FixedPoint2
{
private:
int16_t m_digi; //chosen because I want the range
int8_t m_deci; //chosen to optimise memory
public:
FixedPoint2(int16_t digi = 0, int8_t deci = 0):m_digi{digi}, m_deci{deci}
{
assert(!(deci>127 || deci<-127)); //to prevent overflows
if(deci<-100 || deci>100) //just in case some moron (me) does some weird decimal calculations
{
m_digi+=(static_cast<int16_t>(deci)/100);
m_deci+=(-100);
}
}
FixedPoint2(double mydouble)
{
if (mydouble>=0) //The if-else floors the absolute value of the integer base
{
m_digi=static_cast<int16_t>(floor(mydouble));
}
else
{
m_digi=static_cast<int16_t>(floor(mydouble)+1);
}
m_deci=static_cast<int8_t>(round(100*(mydouble-m_digi))); //This rounds off the decimal to two digits
};
operator double();
friend ostream& operator<<(ostream &out, const FixedPoint2 &f1);
friend istream& operator>>(istream &in, FixedPoint2 &f1);
friend FixedPoint2 operator+(const FixedPoint2 &f1, const FixedPoint2 &f2);
};
FixedPoint2::operator double()
{
double base= static_cast<double>(m_digi);
double decimal= static_cast<double>(m_deci);
return base+0.01*decimal;
}
ostream& operator<<(ostream &out, const FixedPoint2 &f1)
{
FixedPoint2 a=f1;
out << double(a); //this is an easy work around to handling the period placement for the fixed point number
return out;
}
istream& operator>>(istream &in, FixedPoint2 &f1)
{
double placeholder;
in>>placeholder;
f1=FixedPoint2(placeholder);
return in;
}
FixedPoint2 operator+(const FixedPoint2 &f1, const FixedPoint2 &f2)
{
return FixedPoint2(f1.m_digi+f2.m_digi, f1.m_deci+f2.m_deci);
}
编译器不会自动生成operator==
因为赔率非常好,所以它会比错误得多。 我们举一个简单的例子:一个动态字符串。 编译器会生成比较字符的代码,对吗? 它什么时候停止? 现在编译器需要更多地了解程序员的意图和字符串,编译器不需要额外的心灵感应接口的复杂性。
更好地遵循一致的规则,不要强制明确定义要比较的东西,而不是由于人们假设他们得到他们想要的东西而产生的废话代码雷区。 有关此主题的更长时间的讨论:为什么C ++编译器不定义运算符==和运算符!=?
编译器会寻找一种方法来满足比较。 它没有找到直接operator==
,但它确实找到了operator double
和double
s可用于比较。 除了有时他们不能:浮点数学是否被破坏?
这就是说我无法重现OP的结果。 我期望在完全相同的输入上执行完全相同的公式以获得完全相同的结果,即使结果是1.199999 ...而不是1.2
虽然我不能复制,但是OP实现定点运算operator==
仍然更好,因为没有固定点编号的不精确性。 固定点将相等或不相等,不会是ifs ands或buts,所以“没有什么可以出错的!” 另外,这个操作符应该是微不足道的。 像return (rhs.m_digi == lhs.m_digi) && (rhs.m_deci == lhs.m_deci);
上一篇: The equality operator (==) in my class is not working
下一篇: Equality check for objects of classes with explicit constructor only