С++ перегрузка операторов и указатели

Тема в разделе "LANGS.C", создана пользователем EugeneFomenko, 29 июл 2008.

  1. EugeneFomenko

    EugeneFomenko New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2008
    Сообщения:
    3
    почему не работает следующая перегрузка (С++):

    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);
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    EugeneFomenko
    Ты же сравниваешь объекты, а не указатели. По-этому верно - bool operator==(ClassName &ob2);
     
  3. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    указатель - сам по себе тип, для него сделать перезагрузку нельзя. Можно сравнивать объекты, на которые указатели указывают:

    *ob1 == *ob2
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    W4FhLF
    Это что - *ob1 == *ob2, разименовывание объектов?
     
  5. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Booster
    да. фактически происходит вызов bool operator ==(const ClassName &rhs)
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    EugeneFomenko

    Это мембер-оператор, его семантика вызова это ob1 == &ob2.


    Не-мемберы-операторы можно перегружать только для классов, структур, юнионов, енамов и ссылок на них.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    varnie
    Не понял, ты о чём? Разименовывают указатели, а не объекты.
     
  8. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Booster
    я про это и сказал. разыменовываются указатели.
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Офтоп: Интересно, почему разыменование называется "разыменование"? Какова предыстория словообразования? Для каких предметов из повседневной жизни можно применить слово "разыменование"?

    Именовать - Разыменовать это как Любить - Разлюбить? :) Типа забрать имя, получив содержимое? Брр...
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    varnie
    Ладно проехали, на самом деле не понятно, что автор сравнивает, объекты или указатели.
    Можно крутить и так и эдак.
     
  11. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    _DEN_

    Да это всё сложности перевода, я так думаю :) Исходный термин ведь dereferencing. Вполне логично, указатель ссылается(указывает) на какой-то объект, если необходимо получить этот объект надо отдереференсить указатель :)
     
  12. EugeneFomenko

    EugeneFomenko New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2008
    Сообщения:
    3
    > Ладно проехали, на самом деле не понятно, что автор сравнивает, объекты или указатели.
    > Можно крутить и так и эдак.

    if (ob1 == ob2) - здесь я в программе сравниваю указатели.
    Да я что-то и не задумывался раньше над этим. Думал перегружу операцию для указателей и будет все норм, ан нет.

    А вот еще вопрос. Как в C++ реализовать интерфейсы? Сделать абстрактный класс с чисто виртуальными функциями, а потом в классе, реализующем интерфейс, его наследовать?
     
  13. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Да. Можно сделать класс шаблонным, при надобности.
     
  14. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Именно.

    Код (Text):
    1. class TheInterface
    2. {
    3. public:
    4.     virtual ~TheInterface()
    5.     {
    6.     }
    7.  
    8.     // your interface spec
    9.     virtual void OnInit() = 0;
    10. };
     
  15. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Запретили не зря, нарушается семантика указателей и такой код будет нечитабелен для остальных С++ кодеров.
    Но если хочешь что бы было похоже на сравнение указателей, сделай для них обёртку, заодно от других проблем избавишься.
    Код (Text):
    1. typedef std::auto_ptr<ClassName> ClassNamePtr;
    2. bool operator==(ClassNamePtr const & ob1, ClassNamePtr const & ob2) { return ob1->key == ob2->key; }
     
  16. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    J0E

    Политика владения у автоптр-а отличается от обычных указателей. Так просто переехать на них не получится.

    Кстати говоря - изначальная мотивация введения ссылок как раз и заключалась в том, чтобы предоставить приемлемую форму перегрузки операторов, так что юзайте ссылки - их за тем и придумали.
     
  17. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    _DEN_
    а также для передачи параметров в ф-ции:
    (c) Stroustrup
    (c) C++ FAQ
     
  18. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Хорошая рекомендация :)
     
  19. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Ты меня поставил в тупик :) С одной стороны, получится заменить или нет - без автороского кода скадать могут только телепаты (но предположить, что где-то зыбыли delete, может каждый). С другой стороны, я подразумеваю, что ты заметил const&, а значит владение в operator== не передаётся.

    Поскольку ответа с решением никто не дал, идея была в том, что для обхода ограничений языка (не предлагать же ключ /d1nonUDToperators :)) указатель дожен быть заменен пользовательским типом. Что это за тип - автор выберет сам, смартпоинтеров больше одного ;) И никто не мешает реализовать класс-эмулятор голого указателя.

    А ссылка никак не заменит указатель, если он не константный.
     
  20. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    J0E

    Заметил, но речь не об этом. Речь о том, что помимо приведенного фрагмента, снаружи существуют еще тысячи строк кода, пронизанные обычными указателями, и просто так сделать замену я думаю не удастся :)


    Ты имеешь ввиду что ссылка не позволит прыгать по адресному пространству? Так это наоборот ей только в плюс, поскольку она обезопасит пользователя от выхода за отведенный фрагмент памяти.