почему не работает следующая перегрузка (С++): bool operator==(ClassName *ob2) { if (this->key == ob2->key) return true; else return false; } в месте программы, где сравниваются объекты (ob1 == ob2) функция перегрузки не вызывается, а просто сравниваются указатели. как я понял, язык не предусматривает передачу указателей на объект в функцию, перегружающую оператор? иными словами единственные варианты, это: 1) bool operator==(ClassName ob2); 2) bool operator==(ClassName &ob2);
EugeneFomenko Ты же сравниваешь объекты, а не указатели. По-этому верно - bool operator==(ClassName &ob2);
указатель - сам по себе тип, для него сделать перезагрузку нельзя. Можно сравнивать объекты, на которые указатели указывают: *ob1 == *ob2
EugeneFomenko Это мембер-оператор, его семантика вызова это ob1 == &ob2. Не-мемберы-операторы можно перегружать только для классов, структур, юнионов, енамов и ссылок на них.
Офтоп: Интересно, почему разыменование называется "разыменование"? Какова предыстория словообразования? Для каких предметов из повседневной жизни можно применить слово "разыменование"? Именовать - Разыменовать это как Любить - Разлюбить? Типа забрать имя, получив содержимое? Брр...
varnie Ладно проехали, на самом деле не понятно, что автор сравнивает, объекты или указатели. Можно крутить и так и эдак.
_DEN_ Да это всё сложности перевода, я так думаю Исходный термин ведь dereferencing. Вполне логично, указатель ссылается(указывает) на какой-то объект, если необходимо получить этот объект надо отдереференсить указатель
> Ладно проехали, на самом деле не понятно, что автор сравнивает, объекты или указатели. > Можно крутить и так и эдак. if (ob1 == ob2) - здесь я в программе сравниваю указатели. Да я что-то и не задумывался раньше над этим. Думал перегружу операцию для указателей и будет все норм, ан нет. А вот еще вопрос. Как в C++ реализовать интерфейсы? Сделать абстрактный класс с чисто виртуальными функциями, а потом в классе, реализующем интерфейс, его наследовать?
Именно. Код (Text): class TheInterface { public: virtual ~TheInterface() { } // your interface spec virtual void OnInit() = 0; };
Запретили не зря, нарушается семантика указателей и такой код будет нечитабелен для остальных С++ кодеров. Но если хочешь что бы было похоже на сравнение указателей, сделай для них обёртку, заодно от других проблем избавишься. Код (Text): typedef std::auto_ptr<ClassName> ClassNamePtr; bool operator==(ClassNamePtr const & ob1, ClassNamePtr const & ob2) { return ob1->key == ob2->key; }
J0E Политика владения у автоптр-а отличается от обычных указателей. Так просто переехать на них не получится. Кстати говоря - изначальная мотивация введения ссылок как раз и заключалась в том, чтобы предоставить приемлемую форму перегрузки операторов, так что юзайте ссылки - их за тем и придумали.
Ты меня поставил в тупик С одной стороны, получится заменить или нет - без автороского кода скадать могут только телепаты (но предположить, что где-то зыбыли delete, может каждый). С другой стороны, я подразумеваю, что ты заметил const&, а значит владение в operator== не передаётся. Поскольку ответа с решением никто не дал, идея была в том, что для обхода ограничений языка (не предлагать же ключ /d1nonUDToperators ) указатель дожен быть заменен пользовательским типом. Что это за тип - автор выберет сам, смартпоинтеров больше одного И никто не мешает реализовать класс-эмулятор голого указателя. А ссылка никак не заменит указатель, если он не константный.
J0E Заметил, но речь не об этом. Речь о том, что помимо приведенного фрагмента, снаружи существуют еще тысячи строк кода, пронизанные обычными указателями, и просто так сделать замену я думаю не удастся Ты имеешь ввиду что ссылка не позволит прыгать по адресному пространству? Так это наоборот ей только в плюс, поскольку она обезопасит пользователя от выхода за отведенный фрагмент памяти.