Перегрузка операторов сравнения == C ++

У меня есть базовый класс Person с 3 экземплярами vars. Person (строковое имя, длинный беззнаковый идентификатор, строковый адрес электронной почты) и один производный класс Student, который наследует Person и имеет один новый экземпляр var year Student (строковое имя, беззнаковый длинный идентификатор, int year, строковый адрес электронной почты): Person (name, id, email ) и один классный учитель, описывать который не нужно.

Затем создайте класс с именем eClass

и я хочу перегрузить оператор сравнения == и использовать этот оператор в функции bool exists (), когда я компилирую свой .cpp, у меня есть эта ошибка

ошибка: невозможно определить функцию-член 'Student :: operator ==' в'eClass. Кто-нибудь может мне с этим помочь?

Также я не понимаю const

в этой функции моего кода. что делать?

bool Student :: operator == (const Student * & scnd) const {... ... ...}

eClass{
  private:
  Teacher* teacher;
  string eclass_name;
  Student* students[MAX_CLASS_SIZE];
  unsigned int student_count;

   public:
   eClass(Teacher* teach, string eclsnm){
   teacher=teach;
   eclass_name=eclsnm;
  }
   bool Student::operator==(const Student* &scnd)const{
         return(getID==scnd.getID
         &&getName==scnd.getName
         &&getYear==scnd.getYear
         &&getEmail==scnd.getEmail);

   }
   bool exists(Student* stud){
       for(int i=0; i<MAX_CLASS_SIZE;++i){
       if(stud==students[i]){return TRUE;}
       }
       return FALSE;
   }
}

person sudogetit    schedule 11.12.2012    source источник


Ответы (2)


Вы пытаетесь объявить метод сравнения учеников в eClass. Показанный вами оператор == должен в основном принадлежать Student, а не eClass. Константа в этом случае гарантирует вам, что указатель не будет изменен каким-либо образом, что определенно нежелательно, когда вы хотите просто сравнить два объекта.

person d33tah    schedule 11.12.2012
comment
Это неверно const. Это означает, что объект, переданный как this, не будет изменен, кроме его mutable членов, которые все еще могут быть изменены. - person chris; 12.12.2012
comment
также оператор - это зарезервированное слово в C ++ - person imulsion; 20.01.2013

Вы должны переместить оператор сравнения в класс Student, использовать только ссылку (не ссылку на указатель) и, наконец, вам не хватает фигурных скобок при вызове метода.

class Student : public Person {
public:
   bool operator==(const Student &scnd)const{
         return getID()==scnd.getID()
         && getName()==scnd.getName()
         && getYear()==scnd.getYear()
         && getEmail()==scnd.getEmail();
   }
};

Но что вам действительно нужно сделать, так это переместить часть оператора сравнения в класс Person и использовать его в своем классе Student.

class Person {
public:
   bool operator==(const Person &scnd)const{
         return getID()==scnd.getID()
         && getName()==scnd.getName()
         && getEmail()==scnd.getEmail();
   }
};

class Student : public Person {
public:
   bool operator==(const Student &scnd)const{
         return Person::operator==(scnd)
         && getYear()==scnd.getYear();
   }
};

В вашем exists() методе вы сравниваете указатели со студентами. Для этого вам не нужен оператор сравнения.

person Olaf Dietsche    schedule 11.12.2012