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


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

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

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

Оффлайн Shalmaran

  • Автор темы
  • Активист
  • *
  • Сообщений: 839
  • 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

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

Код: (c++) [Выделить]
if (*t1 == *t2)

Оффлайн Shalmaran

  • Автор темы
  • Активист
  • *
  • Сообщений: 839
  • 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. Убери указатели.
Код: (cpp) [Выделить]
   TTime t1 = TTime(1,2,3);
   TTime t2 = TTime(4,5,6);
   TTime t3 = TTime(1,2,3);
   TTime t4 = TTime(7,8,9);

2. С помощью операторов сравниваются переменные класса. Указатели и можно сравнить и без перегруженных операторов.
Код: (cpp) [Выделить]
   // 1 способ
   if (&t1 == &t3) {}

   // 2 способ
   TTime *pt1 = &t1;
   TTime *pt3 = &t1;
   if (pt1 == pt3) {}

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

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 754
    • Просмотр профиля
Re: Перегрузка операторов c++
« Ответ #5 : 24 Апреля 2016, 11:42:55 »
Код: (c++) [Выделить]
#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 = 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);


   if(*t1 == *t3) {
      cout << "1" << endl;
  }

   if(*t1 < *t2) {
      cout << "2" << endl;
  }

// Так делать нельзя - утечка памяти. Выделенная под t4 память будет недоступна и не освобождена.
//   t4 = t2;
//   if(t2 == t4) {
//     cout << "3" << endl;
//      // Отрабатывает!
//   }
}

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

Оффлайн Shalmaran

  • Автор темы
  • Активист
  • *
  • Сообщений: 839
  • 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 »
Всё правильно в результате (как написано в коде). Какой ответ не нравится?

Так, например:
Код: (cpp) [Выделить]
TTime *t1 = new TTime(1, 2, 3);
TTime *t3 = new TTime(1, 2, 3);
// ...
cout << "t1 >= t2? ";
   if (*t1 >= *t3) { cout << "Yes!" << endl; }

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

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

Оффлайн Shalmaran

  • Автор темы
  • Активист
  • *
  • Сообщений: 839
  • 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.038 секунд. Запросов: 26.