Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Перегрузка операторов c++  (Прочитано 526 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Shalmaran

  • Автор темы
  • Активист
  • *
  • Сообщений: 815
  • Cow super power!
    • Просмотр профиля
    • kristyushatmb.livejournal.com
Перегрузка операторов c++
« : 23 Апрель 2016, 02:11:48 »
Где я накосячил?! Ни как понять не могу.

#include <iostream>


using namespace std;




class TTime {
public:
   unsigned int h;
   unsigned int m;
   unsigned int s;


   TTime(int h = 0, int m = 0, int s = 0) {
      this->h = h;
      this->m = m;
      this->s = s;
   }


   TTime(TTime & t) {
      this->h = t.h;
      this->m = t.m;
      this->s = t.s;
   }


   TTime & operator = (TTime const & a) {
      this->h = a.h;
      this->m = a.m;
      this->s = a.s;
      return *this;
   }


   bool operator==(TTime& a) const {
      return ((a.h == this->h) && (a.m == this->m) && (a.s == this->s));
   }


   bool operator!=(TTime& a) const {
      return !(*this == a);
   }


   bool operator> (const TTime& a) const {
      return ((this->h > a.h) && (this->m > a.m) && (this->s > a.s));
   }


   bool operator< (const TTime& a) const {
      return ((this->h < a.h) && (this->m < a.m) && (this->s < a.s));
   }


   bool operator>= (const TTime& a) const {
      return ((this->h >= a.h) && (this->m >= a.m) && (this->s >= a.s));
   }


   bool operator<= (const TTime& a) const {
      return ((this->h <= a.h) && (this->m <= a.m) && (this->s <= a.s));
   }
};


int main(void)
{
   TTime *t1 = TTime(1,2,3);
   TTime *t2 = TTime(4,5,6);
   TTime *t3 = TTime(1,2,3);
   TTime *t4 = TTime(7,8,9);


   if(t1 == t3) {
      // Не отрабатывает!
  }


   t4 = t2;
   if(t2 == t4) {
      ...
      // Отрабатывает!
   }
}

Пользователь добавил сообщение 23 Апрель 2016, 03:00:23:
Я пробовал даже вот такие сомнительные конструкции, вроде этой:

friend bool operator==(const TTime& left, const TTime& right) {
return ((left.h == right.h) && (left.m == right.m) && (left.s == right.s));
}
Всё равно не получается.
« Последнее редактирование: 23 Апрель 2016, 03:00:23 от Shalmaran »
Banana Pi

Оффлайн kupamaan

  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Re: Перегрузка операторов c++
« Ответ #1 : 23 Апрель 2016, 04:43:46 »
Может быть заменить в конструкторе int на unsigned?

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 716
    • Просмотр профиля
Re: Перегрузка операторов c++
« Ответ #2 : 23 Апрель 2016, 06:03:01 »
Ты сравниваешь значение указателей

Код: C
  1. if (*t1 == *t2)

Оффлайн Shalmaran

  • Автор темы
  • Активист
  • *
  • Сообщений: 815
  • Cow super power!
    • Просмотр профиля
    • kristyushatmb.livejournal.com
Re: Перегрузка операторов c++
« Ответ #3 : 23 Апрель 2016, 10:17:59 »
kupamaan, Значения типов, конечно, важны, но не в этом случае (они приводятся к signed).


aSmile, Спасибо, начинаю вспоминать!


Когда практики нет - забываешь очень быстро. Не писал на ++ очень много лет.




Теперь не выполняется условие
*time > *time2, и прочие производные из класса <, <=, >=
« Последнее редактирование: 23 Апрель 2016, 10:43:14 от Shalmaran »
Banana Pi

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Перегрузка операторов c++
« Ответ #4 : 23 Апрель 2016, 14:28:31 »
1. Убери указатели.
Код: C++
  1.    TTime t1 = TTime(1,2,3);
  2.    TTime t2 = TTime(4,5,6);
  3.    TTime t3 = TTime(1,2,3);
  4.    TTime t4 = TTime(7,8,9);

2. С помощью операторов сравниваются переменные класса. Указатели и можно сравнить и без перегруженных операторов.
Код: C++
  1.    // 1 способ
  2.    if (&t1 == &t3) {}
  3.  
  4.    // 2 способ
  5.    TTime *pt1 = &t1;
  6.    TTime *pt3 = &t1;
  7.    if (pt1 == pt3) {}

<вырезано> (тут была моя ошибка)
« Последнее редактирование: 25 Апрель 2016, 04:35:04 от unimix »

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 716
    • Просмотр профиля
Re: Перегрузка операторов c++
« Ответ #5 : 24 Апрель 2016, 11:42:55 »
Код: C
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class TTime {
  6. public:
  7.    unsigned int h;
  8.    unsigned int m;
  9.    unsigned int s;
  10.  
  11.    TTime(int h = 0, int m = 0, int s = 0) {
  12.       this->h = h;
  13.       this->m = m;
  14.       this->s = s;
  15.    }
  16.  
  17.    TTime(TTime & t) {
  18.       this->h = t.h;
  19.       this->m = t.m;
  20.       this->s = t.s;
  21.    }
  22.  
  23.    TTime & operator = (TTime const & a) {
  24.       this->h = a.h;
  25.       this->m = a.m;
  26.       this->s = a.s;
  27.       return *this;
  28.    }
  29.  
  30.    bool operator==(TTime& a) const {
  31.       return ((a.h == this->h) && (a.m == this->m) && (a.s == this->s));
  32.    }
  33.  
  34.    bool operator!=(TTime& a) const {
  35.       return !(*this == a);
  36.    }
  37.  
  38.    bool operator> (const TTime& a) const {
  39.       return ((this->h > a.h) && (this->m > a.m) && (this->s > a.s));
  40.    }
  41.  
  42.    bool operator< (const TTime& a) const {
  43.       return ((this->h < a.h) && (this->m < a.m) && (this->s < a.s));
  44.    }
  45.  
  46.    bool operator>= (const TTime& a) const {
  47.       return ((this->h >= a.h) && (this->m >= a.m) && (this->s >= a.s));
  48.    }
  49.  
  50.    bool operator<= (const TTime& a) const {
  51.       return ((this->h <= a.h) && (this->m <= a.m) && (this->s <= a.s));
  52.    }
  53. };
  54.  
  55.  
  56. int main(void)
  57. {
  58.    TTime *t1 = new TTime(1,2,3);
  59.    TTime *t2 = new TTime(4,5,6);
  60.    TTime *t3 = new TTime(1,2,3);
  61.    TTime *t4 = new TTime(7,8,9);
  62.  
  63.  
  64.    if(*t1 == *t3) {
  65.       cout << "1" << endl;
  66.   }
  67.  
  68.    if(*t1 < *t2) {
  69.       cout << "2" << endl;
  70.   }
  71.  
  72. // Так делать нельзя - утечка памяти. Выделенная под t4 память будет недоступна и не освобождена.
  73. //   t4 = t2;
  74. //   if(t2 == t4) {
  75. //     cout << "3" << endl;
  76. //      // Отрабатывает!
  77. //   }
  78. }

В консоль выводятся и 1, и 2.

Оффлайн Shalmaran

  • Автор темы
  • Активист
  • *
  • Сообщений: 815
  • Cow super power!
    • Просмотр профиля
    • kristyushatmb.livejournal.com
Re: Перегрузка операторов c++
« Ответ #6 : 24 Апрель 2016, 23:49:18 »

Не получается всё равно... Блин, простейшая же задача!

#include "stdafx.h"




using namespace std;




class TTime {
public:
   unsigned int h;
   unsigned int m;
   unsigned int s;




   TTime(int h = 0, int m = 0, int s = 0) {
      this->h = h;
      this->m = m;
      this->s = s;
   }




   TTime(TTime & t) {
      this->h = t.h;
      this->m = t.m;
      this->s = t.s;
   }




   TTime & operator = (TTime const & a) {
      this->h = a.h;
      this->m = a.m;
      this->s = a.s;
      return *this;
   }




   unsigned long inSeconds(void) {
      return this->s + (this->m * 60) + (this->h * 60 * 60);
   }




   bool operator==(TTime& a) const {
      return ((a.h == this->h) && (a.m == this->m) && (a.s == this->s));
   }




   bool operator!=(TTime& a) const {
      return !(*this == a);
   }




   bool operator> (const TTime& a) const {
      return ((this->h > a.h) && (this->m > a.m) && (this->s > a.s));
   }




   bool operator< (const TTime& a) const {
      return ((this->h < a.h) && (this->m < a.m) && (this->s < a.s));
   }




   bool operator>= (const TTime& a) const {
      return ((this->h >= a.h) && (this->m >= a.m) && (this->s >= a.s));
   }




   bool operator<= (const TTime& a) const {
      return ((this->h <= a.h) && (this->m <= a.m) && (this->s <= a.s));
   }
};








int main(void)
{
   TTime *t1 = new TTime(1, 2, 3);
   TTime *t2 = new TTime(4, 5, 6);
   TTime *t3 = new TTime(1, 2, 3);
   TTime *t4 = new TTime(7, 8, 9);




   cout << t1->inSeconds() << endl;
   cout << t2->inSeconds() << endl;
   cout << "addr t1=" << &t1 << endl;
   cout << "addr t2=" << &t2 << endl;




   cout << "t1 == t2? ";
   if (*t1 == *t3) { cout << "Yes!" << endl; }
   else { cout << "No!" << endl; }
   cout << "t1 != t2? ";
   if (*t1 != *t3) { cout << "Yes!" << endl; }
   else { cout << "No!" << endl; }
   cout << "t1 < t2? ";
   if (*t1 < *t3) { cout << "Yes!" << endl; }
   else { cout << "No!" << endl; }
   cout << "t1 > t2? ";
   if (*t1 > *t3) { cout << "Yes!" << endl; }
   else { cout << "No!" << endl; }   
   cout << "t1 <= t2? ";
   if (*t1 <= *t3) { cout << "Yes!" << endl; }
   else { cout << "No!" << endl; }
   cout << "t1 >= t2? ";
   if (*t1 >= *t3) { cout << "Yes!" << endl; }
   else { cout << "No!" << endl; }




   char c;
   cin >> c;
}
Результат:


3723
14706
addr t1=00000070692FFAF8
addr t2=00000070692FFB18
t1 == t2? Yes!
t1 != t2? No!
t1 < t2? No!
t1 > t2? No!
t1 <= t2? Yes!
t1 >= t2? Yes!
Banana Pi

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Перегрузка операторов c++
« Ответ #7 : 25 Апрель 2016, 04:22:12 »
Всё правильно в результате (как написано в коде). Какой ответ не нравится?

Так, например:
Код: C++
  1. TTime *t1 = new TTime(1, 2, 3);
  2. TTime *t3 = new TTime(1, 2, 3);
  3. // ...
  4. cout << "t1 >= t2? ";
  5.    if (*t1 >= *t3) { cout << "Yes!" << endl; }

t1 >= t3 (больше или равно, а оно равно)

Поэтому результат:
t1 >= t2? Yes!

Оффлайн Shalmaran

  • Автор темы
  • Активист
  • *
  • Сообщений: 815
  • Cow super power!
    • Просмотр профиля
    • kristyushatmb.livejournal.com
Re: Перегрузка операторов c++
« Ответ #8 : 25 Апрель 2016, 10:12:58 »
unimix, тьфу, ну конечно! Там опечатка же! Это воскресное пиво :)


Работает!

3723
14706
addr t1=00000028DF19F5B8
addr t2=00000028DF19F5D8
t1 == t2? No!
t1 != t2? Yes!
t1 < t2? Yes!
t1 > t2? No!
t1 <= t2? Yes!
t1 >= t2? No!
« Последнее редактирование: 25 Апрель 2016, 10:15:46 от Shalmaran »
Banana Pi

 

Страница сгенерирована за 0.073 секунд. Запросов: 24.