Существует несколько подходов для написания оператора сравнения, который вы хотите. Самый простой способ, без вмешательства вашего кода класса, это просто реализовать пару операторов, не являющихся членами:
bool operator==(const circle& c, const rect& r) { return r.area == c.area; }
bool operator==(const rect& r, const circle& c) { return c.area == r.area; }
Вы можете поместить их в исходный файл над функцией main
или в отдельный заголовочный файл. Обратите внимание, что они не должны быть друзьями circle
и rect
, так как area
участник является публичным.
Другой способ - написать функции-члены, но сначала нам нужно исправить существующие операторы сравнения:
class circle
{
public:
bool operator==(const circle& other) const { return area == other.area; }
// ...skipped...
};
Чем и чем она отличается от вашей версии?
- Это функция-член, которая сравнивает
this
с other
, принимая только один аргумент.
- Общедоступно звонить извне
circle
класса
- Это константная квалификация, потому что для этого требуется только поиск данных класса без изменений.
Также квалификатор const позволяет сравнивать объекты const следующим образом:
const circle c1 = getSomeCircle();
const circle& c2 = otherCircle;
c1 == c2; // Note: statement has no effect, despite it's syntax is correct.
c2 == c1;
Неконстантное сравнение не скомпилируется. В общем, это самый идиоматический способ написания операторов сравнения на C ++.
Наконец, давайте добавим кружок к прямоугольному сравнению:
class rect;
class circle
{
public:
bool operator==(const circle& other) const { return area == other.area; }
bool operator==(const rect&) const;
// ...skipped...
};
class circle { /* class definition skipped */ };
bool operator==(const rect& r) const { return area == r.area; }
Здесь сначала мы объявили класс rect
. Когда класс объявлен, но не определен (то есть предварительное объявление ), мы можем использовать указатели и ссылки на его экземпляры, но не сами экземпляры. Одна из причин, по которой мы не можем использовать экземпляры, заключается в том, что размер класса неизвестен до его определения.
Затем мы объявляем член operator==
, принимающий ссылку на объявленный вперед класс, и, наконец, после определения rect
мы можем реализовать оператор.
rect
- circle
сравнение может быть реализовано одинаково.