#include <iostream>
using namespace std;
class family
{
private:
double weight;
double height;
public:
family(double x,double y);
~family();
double getWeight();
double getHeight();
double setWeight();
double setHeight();
bool operator==(const family &,const family &);
};
bool family::operator ==(const family &a,const family &b)
{
return(a.getWeight() == b.getWeight());
}
family::family(double x, double y)
{
weight = x;
height = y;
}
double family::getWeight()
{
return weight;
}
double family::getHeight()
{
return height;
}
family::~family(){}
int main()
{
family a(70.0,175.2);
family b(68.5,178.2);
if(a==b)
cout << "A is bigger than B" << endl;
else
cout << "A is smaller than B" << endl;
return 0;
}
我想使用方法来重载等于运算符。 但是,我有一条错误消息
"no match for ‘operator ==’ in ‘a == b’"
为什么出现此错误消息? 此外,我想知道为什么有参考符号“&amp;” in(const family&amp;,const family&amp;)。 请给我一些修改我的代码的建议b.b。
答案 0 :(得分:4)
为什么出现此错误消息?
如果将二元运算符实现为成员函数,它只接收右侧作为参数,左侧是调用对象。如果你写:
a == b
编译器查找满足以下任一项的函数:
(return type) (type of lhs)::operator==( (type of rhs));
或
(return type) operator==( (type of lhs), (type of rhs) );
注意:(返回类型)可以是任何东西,但通常你想在这里返回bool。它不会影响编译器在进行函数调用时所查找的内容。
您的功能签名是:
(return type) (type: family)::operator==( (type: family), (type: family) );
这是期待三个参数(一个暗示)!
此外,我想知道为什么有参考符号&#34;&amp;&#34; in(const family&amp;,const family&amp;)。
const family &
是函数接受的参数类型。它通过引用接收family
类型的对象(也就是说,它使用原始对象而不是复制它们),并且它承诺不修改它们(const
)。编译器将强制执行此承诺。由于该功能不需要修改任何一个对象,并且没有理由制作任何一个对象的完整副本,因此这正是使用的正确签名。对于非成员函数。
对于成员函数,您必须稍微修改它:
class family
{ // ...
bool operator==(
// ...
}
到目前为止这很好,我们不需要改变任何东西。您的参数列表应仅包含右侧参数,因此:
bool operator==(const family&)
但我们还没有完成。记住非成员函数如何使用&#34; const family&amp;&#34;作为参数类型?不知何故,我们需要将调用对象标记为const。我们通过在最后添加const来做到这一点:
bool operator==(const family&) const;
(调用对象已经可以通过引用获得了。)
当你去编写函数本身时,只需使用:
bool family::operator==(const family &rhs) const {
...
}
然后对于函数体,你可以直接使用调用对象的成员和rhs,也可以调用它们的相关函数,如下所示:
return weight == rhs.weight; // direct member access
或
return getWeight() == rhs.getWeight(); // using functions
答案 1 :(得分:2)
如果将operator==
实现为成员函数,则只需要一个参数。
或者在实践中,您可以将其实现为免费功能
class family
{
private:
double weight;
double height;
public:
family(double x,double y);
~family();
double getWeight() const;
double getHeight() const;
double setWeight();
double setHeight();
};
bool operator==(const family &a,const family &b)
{
return a.getWeight() == b.getWeight();
}
更新:
AS operator==
接受const系列对象,你需要使getWight()/getHeight()
函数const。
答案 2 :(得分:1)
您可以在代码中执行以下更改:
double getWeight() const;
。
bool operator==(const family &);
。
bool family::operator==(const family &b)
{
return weight == b.getWeight();
}
答案 3 :(得分:0)
两种可能性: (1)如果你想保持你的定义相同: 声明为非会员和朋友:
friend bool operator==(const family &,const family &);
定义为:
bool operator ==(const family &a,const family &b)
{
return(a.getWeight() == b.getWeight());
}
(2)声明为成员(隐式参数是此指向的当前对象): 声明为非会员和朋友:
bool operator==(const family &);
定义为:
bool family::operator ==(const family &a)
{
return(this->getWeight() == a.getWeight());
}