重载 C++ 运算符时遇到问题
Having issues with overloading C++ operators
我在理解这个概念时遇到了一些问题。在main.cpp文件中,我们有一个函数如下:
void TestComparison()
{
MyFloat X, Y;
cout << "\n\n============ Testing \"==\" for MyFloat ================\n";
do
{
cout << "\nEnter X ==> ";
X.Read();
cin.ignore(1000, '\n'); // Discard all chars in input stream.
cout << "\nEnter Y ==> ";
Y.Read();
cin.ignore(1000, '\n'); // Discard all chars in input stream.
cout << "\n\n";
if ( X == Y )
{
X.Write(); cout << " is equal to "; Y.Write();
}
else
{
X.Write(); cout << " is NOT equal to "; Y.Write();
}
}
while ( SpaceBarToContinue() );
}
这是class我正在写的:
class MyFloat
{
enum {MAXDIGIT=20};
char Number[MAXDIGIT+1];
char NumberOfDigits;
public:
friend void AssignValue(MyFloat& X);//remove after the program works
MyFloat();
int Digits();
int MaxDigits();
void Read();
void Write();
MyFloat operator + (MyFloat x);
int operator== (MyFloat x);
};
这是我的 == 重载函数存根:
int MyFloat::operator== (MyFloat x)
{
int Flag=0;
return 1;
}
这样做的唯一目的是比较两个对象数组 X 和 Y。它们被传递到 == 重载函数中。我应该编写比较它们的算法。我知道如何编写比较这两个字符数组的算法,这不是问题,但我不明白的是 X 和 Y 如何进入重载函数来比较它们?大体上,代码( X == Y )
用于获取0或1。X和Y如何传递到函数中?
例如,我假设我的函数存根需要用 2 个参数重写:
int MyFloat::operator== (MyFloat x, MyFloat y)
{
int Flag=0;
return 1;
}
但是这样做会在 ( X == Y )
的函数调用期间在 main 中产生一个错误,指出 'Overload "operator==" must be a binary operator (has 3 parameters)'
所以我对如何将 MyFloat 的两个对象都放入函数中进行比较感到非常困惑。我对编程还很陌生(学习了 5-6 个月),非常感谢任何简单明了的答案。
成员函数(包括重载运算符)有一个隐含的 this
参数传入。在你的情况下,因为你使用的是 operator==
的成员版本,你应该只需要一个参数,另一个是 this
.
您应该使用 this
指针。更多信息:Source
bool MyFloat::operator==(const MyFloat& x) const
{
for(int i = 0; i < x.MaxDigits; ++i)
{
if(x[i] != (*this)[i])
return false;
}
return true;
}
当你写:
if(a == b)
真正的意思是:
if(a.operator==(b))
所以在你的方法中:
bool MyFloat::operator==(const MyFloat &x) const
{
// x is b in call above
// (*this) is a in call above
// Your class invariant should guarantee this:
// assert(x.NumberOfDigits < MAX_DIGITS);
// In the scope of your class' methods:
// NumberOfDigits corresponds to this->NumberOfDigits
// Number corresponds to this->Number
if(x.NumberOfDigits != NumberOfDigits) return false;
// Same as: if(x.NumberOfDigits != this->NumberOfDigits) return false;
return strncmp(x.Number, Number, NumberOfDigits) == 0;
// Same as: return strncmp(x.Number, this->Number, this->NumberOfDigits) == 0;
}
请注意,我更改了您方法的签名。正确的签名 returns a bool
并采用 const
(因为您不想更改参数)引用(避免复制大对象)作为参数。该方法是(并且必须是)const
,因为它不应该修改对象,并且它必须可以在 const
对象上调用。
请注意,可以使用以下签名将运算符定义为非成员函数(即在 class 之外):
bool operator==(const MyFloat &a, const MyFloat &b)
我在理解这个概念时遇到了一些问题。在main.cpp文件中,我们有一个函数如下:
void TestComparison()
{
MyFloat X, Y;
cout << "\n\n============ Testing \"==\" for MyFloat ================\n";
do
{
cout << "\nEnter X ==> ";
X.Read();
cin.ignore(1000, '\n'); // Discard all chars in input stream.
cout << "\nEnter Y ==> ";
Y.Read();
cin.ignore(1000, '\n'); // Discard all chars in input stream.
cout << "\n\n";
if ( X == Y )
{
X.Write(); cout << " is equal to "; Y.Write();
}
else
{
X.Write(); cout << " is NOT equal to "; Y.Write();
}
}
while ( SpaceBarToContinue() );
}
这是class我正在写的:
class MyFloat
{
enum {MAXDIGIT=20};
char Number[MAXDIGIT+1];
char NumberOfDigits;
public:
friend void AssignValue(MyFloat& X);//remove after the program works
MyFloat();
int Digits();
int MaxDigits();
void Read();
void Write();
MyFloat operator + (MyFloat x);
int operator== (MyFloat x);
};
这是我的 == 重载函数存根:
int MyFloat::operator== (MyFloat x)
{
int Flag=0;
return 1;
}
这样做的唯一目的是比较两个对象数组 X 和 Y。它们被传递到 == 重载函数中。我应该编写比较它们的算法。我知道如何编写比较这两个字符数组的算法,这不是问题,但我不明白的是 X 和 Y 如何进入重载函数来比较它们?大体上,代码( X == Y )
用于获取0或1。X和Y如何传递到函数中?
例如,我假设我的函数存根需要用 2 个参数重写:
int MyFloat::operator== (MyFloat x, MyFloat y)
{
int Flag=0;
return 1;
}
但是这样做会在 ( X == Y )
的函数调用期间在 main 中产生一个错误,指出 'Overload "operator==" must be a binary operator (has 3 parameters)'
所以我对如何将 MyFloat 的两个对象都放入函数中进行比较感到非常困惑。我对编程还很陌生(学习了 5-6 个月),非常感谢任何简单明了的答案。
成员函数(包括重载运算符)有一个隐含的 this
参数传入。在你的情况下,因为你使用的是 operator==
的成员版本,你应该只需要一个参数,另一个是 this
.
您应该使用 this
指针。更多信息:Source
bool MyFloat::operator==(const MyFloat& x) const
{
for(int i = 0; i < x.MaxDigits; ++i)
{
if(x[i] != (*this)[i])
return false;
}
return true;
}
当你写:
if(a == b)
真正的意思是:
if(a.operator==(b))
所以在你的方法中:
bool MyFloat::operator==(const MyFloat &x) const
{
// x is b in call above
// (*this) is a in call above
// Your class invariant should guarantee this:
// assert(x.NumberOfDigits < MAX_DIGITS);
// In the scope of your class' methods:
// NumberOfDigits corresponds to this->NumberOfDigits
// Number corresponds to this->Number
if(x.NumberOfDigits != NumberOfDigits) return false;
// Same as: if(x.NumberOfDigits != this->NumberOfDigits) return false;
return strncmp(x.Number, Number, NumberOfDigits) == 0;
// Same as: return strncmp(x.Number, this->Number, this->NumberOfDigits) == 0;
}
请注意,我更改了您方法的签名。正确的签名 returns a bool
并采用 const
(因为您不想更改参数)引用(避免复制大对象)作为参数。该方法是(并且必须是)const
,因为它不应该修改对象,并且它必须可以在 const
对象上调用。
请注意,可以使用以下签名将运算符定义为非成员函数(即在 class 之外):
bool operator==(const MyFloat &a, const MyFloat &b)