'a == b'中的'operator =='不匹配

时间:2014-09-25 01:24:52

标签: c++

#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。

4 个答案:

答案 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());
}