2014-09-25 2 views
4
#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; 
} 

Я хочу использовать метод для перегрузки равного оператора. Однако, у меня есть сообщение об ошибкенет соответствия для 'operator ==' in 'a == b'

"no match for ‘operator ==’ in ‘a == b’" 

Почему это сообщение об ошибке придумать? Кроме того, я хочу знать, почему есть ссылочный символ «&» in (const family &, const family &). Пожалуйста, дайте мне несколько советов по изменению моего кода b.b.

ответ

4

Зачем возникает это сообщение об ошибке?

Если вы реализуете двоичный оператор как функцию-член, он принимает только правую часть в качестве аргумента, а левая сторона - вызывающий объект. Если вы пишете:

a == b 

компилятор ищет функцию, которая отвечает либо:

(return type) (type of lhs)::operator==((type of rhs)); 

или

(return type) operator==((type of lhs), (type of rhs)); 

Примечание: (возвращаемый тип) может быть что угодно, хотя обычно вы» d хочу вернуть bool здесь. Это не влияет на то, что ищет компилятор при вызове функции.

Ваша функция подписи вместо этого:

(return type) (type: family)::operator==((type: family), (type: family)); 

Это ожидает три аргумента (один подразумеваемые)!


Кроме того, я хочу знать, почему есть ссылка символ "&" в (сопзИте семейство &, Const семьи &).

const family & - тип аргумента, который принимает функция. Он получает объекты типа family по ссылке (т. Е. Использует исходные объекты, а не делает их копию), и обещает не изменять их (const). Компилятор выполнит это обещание. Так как функции не нужно изменять ни один объект, и нет причин делать полную копию, это именно то, что нужно использовать. Для функции, не являющейся членом.

Для функции члена вы должны изменить его немного:

class family 
{ // ... 
    bool operator==(
    // ... 
} 

Это прекрасно до сих пор, мы не должны ничего менять. В списке параметров должен быть только аргумент правой стороны, поэтому:

bool operator==(const family&) 

Но мы еще не все сделали. Помните, как функция non-member использует «const family &» в качестве типа параметра? Так или иначе, нам нужно также отметить вызывающий объект как const. Мы делаем это путем добавления сопзЬ в самом конце: (. Объект вызова уже доступны, как если бы по ссылке)

bool operator==(const family&) const; 


Когда вы идете, чтобы написать саму функцию, просто использовать:

bool family::operator==(const family &rhs) const { 
    ... 
} 

Тогда для тела функции, вы можете использовать член вызывающего объекта и ОРЗ непосредственно, или вызвать их соответствующие функции, например, так:

return weight == rhs.weight; // direct member access 

или

return getWeight() == rhs.getWeight(); // using functions 
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(); 
} 

Update: AS operator== принимает константные семейные объекты, вам нужно сделать getWight()/getHeight() функцию Уст.

1

Вы можете сделать следующие изменения в коде:

double getWeight() const; 

. .

bool operator==(const family &); 

. .

bool family::operator==(const family &b) 
{ 
     return weight == b.getWeight(); 
} 
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()); 
} 
Смежные вопросы