Ваше решение работает, но оно менее мощное, чем подход friend
.
Когда класс объявляет функцию или другой класс как friend
, это означает, что функция или класс друга имеет доступ к объявленному классу.рядовые и защищенные члены.Это как если бы объявленная сущность была членом декларирующего класса.
Если вы определяете operator==()
как функцию-член, то, как и в случае friend
, функция-член имеет полный доступ к членам класса.,Но поскольку это функция-член, она определяет единственный параметр, поскольку первый параметр подразумевается как this
: объект типа presentation
(или его потомок).Однако, если вы определяете функцию как не являющуюся членом, вы можете указать оба параметра, и это даст вам возможность сравнивать любые два типа, которые могут быть преобразованы в presentation
, используя ту же функцию.
Например:
class presentation {
friend bool operator==(const presentation&, const presentation&);
// ...
};
class Foo : public presentation { /* ... */ };
class Bar : public presentation { /* ... */ };
bool operator==(const presentation& p1, const presentation& p2)
{
// ...
}
bool func(const Foo& f, const Bar& b, const presentation& p)
{
return f == b || f == p );
}
Наконец, возникает вопрос «почему декларация friend
?».Если функция operator==()
не нуждается в доступе к закрытым членам presentation
, тогда действительно лучшее решение - сделать ее функцией, не являющейся членом, не являющейся другом.Другими словами, не предоставляйте функции права доступа, которые не нужны.