На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Перегрузка операторов во всевозможнейших подробностях , Перегрузка операторов во всевозможнейших подробностях
    Доброго времени суток!

    Плюсы "знаю" поверхностно и что-то кодить пытаюсь не столь часто.

    ExpandedWrap disabled
      #include <stdio.h>
       
      //У
      class op1
      {
          protected:
             int a;
             double d;
             bool b;
          public:
             op1(int _a=0,  double _d=0,  bool _b=0) :    a(_a),  d(_d),  b(_b)
             {}
       
             op1 operator+(op1 &ob)
             {
                 a = a + ob.a;
                 d = d + ob.d;
                 b = (b || ob.b);
                 return *this;
             }
       
             op1 operator-(op1 &ob)
             {
                 a = a - ob.a;
                 d = d - ob.d;
                 if (b && !ob.b)   { b = true;    return *this;}
                 if (b && ob.b)    { b = false;   return *this;}
                 if (!b && !ob.b)  { b = true;    return *this;}
                 if (!b && ob.b)   { b = false;   return *this;}
                 return *this;
             }
       
             void print ()  { printf ("Vot %d, %f,  %d\n", a, d, b);}
            
             op1 operator-()
             {
                 a = -a;
                 d = -d;
                 if (b) { b = false;   return *this;}
                 if (!b) { b = true;   return *this;}
                 return *this;
             }
            
             bool operator!= (op1 &ob)
             {
                 return ( (a!=ob.a)||(d!=ob.d)||(b!=ob.b) );
             }
            
              op1 operator= (op1 &ob)
             {
                 if (this != &ob)
                 {
                     a=ob.a;
                     d=ob.d;
                     b=ob.b;
                 }
                 return *this;
             }  
            
             op1 vstavF( int _a,  double _d, bool _b)
             {
                 a=_a; d=_d; b=_b;
                 return *this;
             }
       
       
      };
       
      int main ()
      {
          op1 od (25, 555, true);
          od.print();
          op1 dwa ( 47.58,  false);
          dwa.print();
          dwa = od - dwa;
          dwa.print();
          dwa = -dwa;
          dwa.print();
          op1 tri;
          tri = dwa;
          bool nu=true;
          nu = (tri!=dwa);
          printf ("Vot   %d\n",nu);
          tri.vstavF( 44, 98.5, true);
          dwa.print();
          tri.print();
          
       return 0;
      }



    собственно ошибки

    ||=== Build: Debug in operator (compiler: GNU GCC Compiler) ===|
    G:\void_main\operator\operator.cpp||In function 'int main()':|
    G:\void_main\operator\operator.cpp|75|error: no match for 'operator=' (operand types are 'op1' and 'op1')|
    G:\void_main\operator\operator.cpp|75|note: candidate is:|
    G:\void_main\operator\operator.cpp|49|note: op1 op1::operator=(op1&)|
    G:\void_main\operator\operator.cpp|49|note: no known conversion for argument 1 from 'op1' to 'op1&'|
    G:\void_main\operator\operator.cpp|77|error: no match for 'operator=' (operand types are 'op1' and 'op1')|
    G:\void_main\operator\operator.cpp|77|note: candidate is:|
    G:\void_main\operator\operator.cpp|49|note: op1 op1::operator=(op1&)|
    G:\void_main\operator\operator.cpp|49|note: no known conversion for argument 1 from 'op1' to 'op1&'|
    ||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 13 second(s)) ===|


    Когда нужен и не нужен 'operator='?

    Что именно ему не хватает?

    Как быть?

    Что выдает return *this? Объект но я не могу этого представить, this это указатель и да, он содержит адрес
    объекта эта цифра и ее просто выдать, но объект содержит в себе возможно множество полей и цифр, и как его выдать? а если разименовали звездочкой, то уже не указатель а объект мы имеем!

    Какой и когда бывает 'operator='? Какие еще бывают 'operator'?

    Что почитать во всех подробностях?
      Цитата Necoder @
      Как быть?

      Вот так в своем классе переопредели оператор =
      ExpandedWrap disabled
           op1 operator= (const op1 &ob)


      Цитата Necoder @
      Что именно ему не хватает?

      const ему не хватает, описание ошибок конечно туповатое.

      Добавлено
      И конструктор копирования напиши.

      Добавлено
      Ссылка по теме: https://habrahabr.ru/post/308890/

      Добавлено
      И вообще запомни, или татуху лучше набей: когда в какую либо функцию передаешь объект по ссылке, если внутри этой функции ты его не изменяешь, то всегда пиши const:
      ExpandedWrap disabled
        SomeType SomeFunction(const SomeObject& obj)


      Добавлено
      На всякий случай: https://ideone.com/lWeTxz
      Сообщение отредактировано: KILLER -
        Цитата KILLER @
        const ему не хватает, описание ошибок конечно туповатое.
        Строго говоря, оператор = должен возвращать неконстантную ссылку. То есть такая бредовая конструкция
        ExpandedWrap disabled
          (a = 2) = 3;
        является с точки зрения стандарта вполне корректной.
        Более того, при использовании операторов _= (операция с переменной), её иногда можно даже употребить с пользой.
        ExpandedWrap disabled
          (a = 2) += 1;
          Цитата amk @
          Строго говоря, оператор = должен возвращать неконстантную ссылку.

          Ну да, плюс еще ссылку нужно дописать.
            Спасибо!!!!!! :D

            Ссылка отличная!
            Сообщение отредактировано: Necoder -
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0305 ]   [ 17 queries used ]   [ Generated: 19.03.24, 08:09 GMT ]