Код вашей перегрузки для operator<<
должен быть
friend ostream& operator<< (ostream &o, const CPerson &pn) {
// ^ ^^^^^ ^
o << "Egn" << endl;
o << pn.egn << endl;
o << "Name:" << endl;
o << pn.name << endl;
return o; // since return type is ostream&
}
Вы должны передавать поток по ссылке и возвращать его, как только вы закончили его использовать.Передача по ссылке гарантирует, что используется тот же поток (в отличие от передачи по значению).
Еще один момент, на который следует обратить внимание, это аргументы функции CPerson p
.Они также должны быть переданы по ссылке.С operator<<
ваш CPerson
не будет изменен, поэтому мы можем сохранить его как const
.
Вы также можете следить за своим operator>>
.Опять же, istream is
должно быть istream &is
.С параметром CPerson p
вы будете изменять его, так что вы определенно захотите передать его в качестве ссылки.
friend istream& operator>> (istream &is, CPerson &p) {
// ^ ^
is >> p.egn;
is >> p.name;
return is;
}
В других ваших перегрузках вы должны использоватьconst CPerson &p
также.Более того, ваши перегрузки для operator<
и operator==
не обязательно должны быть friend
ed, поскольку они не имеют доступа к закрытым членам других классов.Таким образом,
bool operator<(const CPerson &p1, const CPerson &p2) {
if (p1.egn < p2.egn) {
return true;
}
return false;
}
bool operator==(const CPerson &p1, const CPerson &p2) {
if (p1.egn == p2.egn) {
return true;
}
return false;
}
Вы захотите привыкнуть к передаче ваших классов по ссылке, так как это экономит место (не нужно копировать-конструировать другой экземпляр класса, как при передаче по значению).Таким образом, эффективнее как в пространстве, так и в плане производительности передавать свои классы по ссылке.