как переопределить оператор

Тема в разделе "LANGS.C", создана пользователем cupuyc, 6 мар 2010.

  1. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    забыл как переопределить оператор. например

    Код (Text):
    1. class Cx
    2. {
    3. private:
    4.   int m_x;
    5. public:
    6.   Cx()
    7.   {
    8.     m_x = 1;
    9.   }
    10. };
    11.  
    12. int operator = (Cx arg)
    13. {
    14.   return arg.m_x;
    15. }
    как-то так. но в то же время функция int operator = (Cx arg) должна быть дружественной. когда объявляю её дружественной - вылетает ошибка "operator=" must be a member function.

    как правильно сделать?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    язык требует, чтобы операторы присваивания ("="), взятия индекса ("[]"),
    вызова ("()") и доступа к членам по стрелке ("->") были определены как члены класса. В противном случае выдается сообщение об ошибке компиляции.
     
  3. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    А что вообще нужно сделать? Чтобы объекты авто-кастились в инт? Чтобы объект мог присваивать себе инт? Или чтобы при присвоении получалась неведомая беспорядочность (один саботирует какой-то проект? :)?
    Код (Text):
    1. class Cx
    2. {
    3. public:
    4.  int operator= (const Cx& arg) const
    5.  {
    6.   return arg.m_x;
    7.  }
    8. };
    ^Неведомая беспорядочность.

    Код (Text):
    1. class Cx
    2. {
    3. public:
    4.  Cx& operator= (int arg)
    5.  {
    6.   m_x = arg;
    7.   return *this;
    8.  }
    9. };
    ^Присвоение инт.

    Код (Text):
    1. class Cx
    2. {
    3. public:
    4.  operator int() const
    5.  {
    6.   return m_x;
    7.  }
    8. };
    ^Авто-каст в инт.
     
  4. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    Sol_Ksacap нетрудно догадаться что каст. уже глянул как в атл. думал через переопределение оператора тоже можно. ошибался.
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Каст через присваивание? Бред.
     
  6. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    почему? в программе я пишу что-то типа

    Код (Text):
    1. Cx x;
    2. int a = x;
    мне нужно действие оператора. обратное преобразование ведь выполняется именно через переопределение оператора, т.е.

    Код (Text):
    1. int a = 0;
    2. Cx x;
    3.  
    4. x = a;
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    cupuyc
    Потому что нужно определить оператор конвертирования, а не присваивания. Конвертор тоже может быть только функцией членом.
     
  8. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Booster
    ... которым является любой конструктор с одним параметром, не объявленный explicit.
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ustus
    >которым является любой конструктор с одним параметром, не объявленный explicit.
    Ну объяви у int конструктор, мы посмотрим. Или думаешь я не в курсе, что может неявно вызываться конструктор? ^)
     
  10. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Booster
    Вообще-то я имел ввиду приведение int -> свой тип. Ибо
    Это ведь не я сказал? :)

    Короче, щас тут все запутаются, особенно ТС.

    Дано: пользовательский тип Cx.
    Требуется: взаимное (неявное) преобразование Cx <-> int, так чтобы Cx можно было использовать везде, где допускается int и наоборот.
    Найти: минимальный набор функций для этого необходимых.
    Решение:
    Код (Text):
    1. class Cx
    2. {
    3. public:
    4.     Cx(int x = 1) : m_x(x) {}
    5.     operator int() const { return m_x; }
    6. private:
    7.     int m_x;
    8. };
    Замечание: переопределение конструктор копирования и оператор присваивания в общем случае не требуются. Таковые нужны только если класс имеет нетривиальную семантику копирования, что в данном случае не наблюдается. Следовательно в данном случае можно положится на определенные по умолчанию реализации.

    :)
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ustus
    Я это могу повторить сколько угодно раз, так как присваивание и конструирование это разные вещи и каст через присваивание абсолютно не укладывается в моей голове.
     
  12. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    Код (Text):
    1. class Cx
    2. {
    3. private:
    4.  int m_x;
    5. public:
    6.  Cx() {}
    7.  ~Cx() {}
    8.  Cx& operator = (int x) { m_x = x; return *this; }
    9. };
    уложился?
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    cupuyc
    Ты различаешь каст и присваивание?
     
  14. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Booster
    А я разве спорю? Я просто предположил, что именно на самом деле было нужно.

    cupuyc
    Просмотри еще раз мой пост. С большой вероятностью это именно то, чего ты хочешь добиться.
     
  15. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    попробовал бы воспользоваться своим кодом, понял бы что говорит Booster.

    // нельзя, конвертирующий конструктор не определен, а именно он и нужен
    Cx x = 0;

    // можно
    Cx x; // мусор
    x = 0;

    Правильно определить Cx(int const&); // для POD можно как в №10

    Cx x(0); // Ok
    Cx xx = 0; // Ok