Оператор перегрузки == - PullRequest
3 голосов
/ 29 июля 2011

Ребята, у меня есть какая-то глупая структура, давайте назовем ее X, и у меня также есть функция fnc (не являющаяся ее членом), возвращающая указатель на эту структуру, поэтому она выглядит так:

    struct  X
    {
bool operator==(const X* right)
{
//...
}
};

X* get(X* another)
{
//...
}

У меня также естьстрока в коде, которая «пытается» сравнить указатели с этими структурами, но реальное намерение состоит в том, чтобы сравнить те структуры, на которые указывают:

if (get(a) == get(b))//here obviously I have two pointers returned to be compared
{
//...
}

Я также определил член X operator==(const X* right), который предполагает работать в вышеупомянутых ситуациях, нопо причине, которую я не понимаю, это не так.Как заставить это работать (Я НЕ МОГУ изменить строку if (get(a) == get(b)), а также get ДОЛЖЕН вернуть указатель).

Ответы [ 4 ]

3 голосов
/ 29 июля 2011

Это не работает: ваши типы являются указателями, и вы не можете перегрузить оператор для встроенных типов. Итак, во-первых, вы сравниваете по разыменованию:

T * a, * b;

if (*a == *b) { ... }

Далее, чтобы сделать эту работу, вы должны реализовать оператор T:

struct T {
  bool operator==(const T & other) const { ... }
  /* ... */
};

Обратите внимание, что оператор должен быть константным и принимать правый аргумент по ссылке констант!

Чтобы обратиться к последнему предложению: если вы оба не можете изменить get(a) == get(b) и , вы также не можете изменить тип get, тогда вы застряли, сравнивая указатели.

3 голосов
/ 29 июля 2011

Вы не можете изменить способ сравнения указателей.Вы должны либо изменить синтаксис оператора if, либо изменить get() для возврата ссылки вместо указателя.Любое другое решение будет довольно хакерским.

Если вы действительно должны жить с этими ограничениями , я бы предложил изменить get(), чтобы он возвращал какой-то специализированный умный указатель для инкапсуляции этого противоречивогоповедение, которое вы хотите, с перегруженным operator ->() и перегруженным operator ==().Я клянусь, хотя, на самом деле это просто напрашивается на неприятности, и я думаю, что вам все равно лучше бороться с любой силой, которая не позволяет вам изменить утверждение if().

2 голосов
/ 29 июля 2011

Если вы не можете изменить строку get(a) == get(b) и не можете изменить get(), то то, чего вы пытаетесь достичь, невозможно.

Перегруженные операторы могут быть определены только тогда, когда хотя бы один операнд имеет пользовательский тип (или ссылку на пользовательский тип). Указатели на классы не отвечают этому требованию, поэтому вы не можете определить оператор, который будет вызываться при сравнении двух указателей.

0 голосов
/ 29 июля 2011
bool operator==(const X* right)

сравнивает X с X *.Не уверен, что есть способ объявить компаратор для обоих X *, но мой C ++ немного заржавел, и вы могли бы попробовать у друга метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...