2014-09-11 2 views
-2

Я пытаюсь определить оператор == в структуры, как это:== перегрузка операторов с структуры

struct names { 
    string fname; 
    string lname; 
bool operator==(names a, names b) { 
    return (a.fname == b.lname); 
} 
}; 

Однако компилятор говорит:

..\src\trash.cpp:10:33: error: 'bool names::operator==(names, names)' must take exactly one argument

Почему это?

+3

Вы выполняете перегрузку как функцию нестатического члена, поэтому он уже имеет неявный параметр объекта. –

+0

Сделать его не членом. – juanchopanza

+1

И желательно не принимать его аргументы по значению. –

ответ

3

Если перегрузить бинарный оператор как функцию члена, то он должен принимать только одну аргумент. Первый операнд - это объект, на который вызывается оператор (т. Е. *this); второй операнд является аргументом единственной функции.

struct names { 
    //... 

    // better to pass by reference; 
    // make the function 'const' so it can be used on constant objects 
    bool operator==(names const & rhs) const { 
     return this->fname == rhs.lname; 
    } 
}; 

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

bool operator==(names const & lhs, names const & rhs) { 
    return lhs.fname == rhs.lname; 
} 

Если необходим доступ к закрытым членам (это не так, в этом примере), тогда это должен был быть друг. Вы можете определить друзей внутри определения класса; в этом случае код будет выглядеть точно так же, как ваш пример, только с friend перед объявлением функции.

(Конечно, это не разумное определение равенства, так как это не является симметричным. Многие алгоритмы сломается, если вы можете иметь a == b, но не b==a, как вы можете с этим определением. lhs.fname == rhs.fname && lhs.lname == rhs.lname бы больше смысла.)

0

ли:

  • В функции члена:

    struct names { 
        string fname; 
        string lname; 
    
        bool operator==(const names& rhs) const { /* Your code */ } 
    }; 
    
  • или в виде свободной функции:

    bool operator==(const names& lhs, const names& rhs) const { /* Your code */ } 
    
0

operator== предназначен для сравнения двух объектов на равенство. У вас есть впечатление сравнить первое и последнее имя для разных объектов, предположительно, чтобы поймать дуэты, такие как Джордж Лазенби и Эмма Джордж.

Я бы сделал это функция член класса и использовать this для одного из объектов:

bool operator== (const names &rhs) const { 
    return (this->fname == rhs.fname) && (this->lname == rhs.lname); 
} 
Смежные вопросы