Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2013, 10:38   #1
Выручайте23
 
Регистрация: 12.12.2013
Сообщений: 4
По умолчанию Ребят выручайте есть перегруженная функция, нужно сделать из нее виртуальную функцию

Сам как не знаю сделать пожалуйста помогите)) Есть перегруженная функция, нужно сделать из нее виртуальную функцию. Даже не обязательно из этой программы, просто по заданию.
Задание. Дата в формате (день, месяц, год). ++увеличение даты на 1 сутки, -- уменьшение даты на 1 сутки, + сложение двух дат.
Код C++
#include <iostream>
#include <math.h>
using namespace std;

class date
{
public:
int day,month,year;
friend date operator ++(date d1);
friend date operator --(date d2);
friend date operator +(date d1,date d2);
};

date operator ++(date d1)
{
if ((d1.month==1) || (d1.month==3) || (d1.month==5) || (d1.month==7) || (d1.month==8) || (d1.month==10))
{
if (d1.day==31)
{
d1.day=1;
d1.month=d1.month+1;
}
else {d1.day=d1.day+1;}
}
else if ((d1.month==4) || (d1.month==6) || (d1.month==9) || (d1.month==11))
{
if (d1.day==30)
{
d1.day=1;
d1.month=d1.month+1;
}
else {d1.day=d1.day+1;}
}
else if (d1.month==12)
{
if(d1.day==31)
{
d1.day=1;
d1.month=1;
d1.year=d1.year+1;
}
else {d1.day=d1.day+1;}
}
else if (d1.month==2)
{
if (d1.day==28)
{
d1.day=1;
d1.month=d1.month+1;
}
else {d1.day=d1.day+1;}
}
else {cout <<"Data error!";}
return d1;
}

date operator --(date d2)
{
if ((d2.month==2) || (d2.month==4) || (d2.month==6) || (d2.month==8) || (d2.month==9) || (d2.month==11))
{
if (d2.day==1)
{
d2.day=31;
d2.month=d2.month-1;
}
else {d2.day=d2.day-1;}
}
else if ((d2.month==5) || (d2.month==7) || (d2.month==10) || (d2.month==12))
{
if (d2.day==1)
{
d2.day=30;
d2.month=d2.month-1;
}
else {d2.day=d2.day-1;}
}
else if (d2.month==1)
{
if(d2.day==1)
{
d2.day=31;
d2.month=12;
d2.year=d2.year-1;
}
else {d2.day=d2.day-1;}
}
else if (d2.month==3)
{
if (d2.day==1)
{
d2.day=28;
d2.month=d2.month-1;
}
else {d2.day=d2.day-1;}
}
else {cout <<"Data error!";}
return d2;
}

date operator +(date d1,date d2)
{
date d;
d.year=d1.year+d2.year;
d.month=d1.month+d2.month;
d.day=d1.day+d2.day;
if (d.month>12){d.month=d.month-12;d.year=d.year+1;}
if (d.day>31){d.day=d.day-31;d.month=d.month+1;}
if (d.month>12){d.month=d.month-12;d.year=d.year+1;}
return d;
}

int main()
{
date d1,d2,d3;
cout <<"Enter first date:"<<endl;
cout <<"Day:";
cin >>d1.day;
cout <<"Month:";
cin >>d1.month;
cout <<"Year:";
cin >>d1.year;
cout <<endl<<"Enter second date:"<<endl;
cout <<"Day:";
cin >>d2.day;
cout <<"Month:";
cin >>d2.month;
cout <<"Year:";
cin >>d2.year;
cout <<endl;
d3=d1+d2;
d1=++d1;
d2=--d2;
cout <<"First date increased by the day:"<<d1.day<<"."<<d1.month<<"."<< d1.year<<endl;
cout <<"Second date less the day:"<<d2.day<<"."<<d2.month<<"."<< d2.year<<endl;
cout <<"Add two date:"<<d3.day<<"."<<d3.month<<"."< <d3.year<<endl;
system ("PAUSE");
return 0;
}
Выручайте23 вне форума Ответить с цитированием
Старый 13.12.2013, 06:49   #2
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Код:
#include <iostream>
using namespace std;
     
    //
    // Абстрактный базовый класс
    //
class CDate
{
    public:
      CDate() {};
      virtual CDate &operator++() = 0;
      virtual CDate &operator++(int) = 0;
      virtual void Show() = 0;
};
     
     
    //
    // Дата, содержащая только ГОД
    //
class CDateYear : public CDate
{
      int m_Year;
     
public:
      CDateYear(int _year) : m_Year(_year) {};
     
      virtual CDate &operator++() { ++m_Year; return *this; };
      virtual CDate &operator++(int) { m_Year++; return *this; };
      virtual void Show() { cout << m_Year << endl; };
};
     
     
    //
    // Дата, содержащая ГОД и МЕСЯЦ
    //
class CDateMonth : public CDateYear
{
      int m_Month;
public:
      CDateMonth(int _year, int _month) : CDateYear(_year), m_Month(_month) {};
     
      virtual CDate &operator++()
      {
        ++m_Month;
        if (m_Month > 12)
        {
          m_Month = 1;
          CDateYear::operator++();
        }
        return *this;
      };
     
      virtual CDate &operator++(int){ ++(*this); };
      virtual void Show() { cout << m_Month << '.'; CDateYear::Show(); };
};
     
     
     
int main()
{
      CDate * d = new CDateMonth(2013, 11);
     
      d->Show();
      ++(*d);
      d->Show();
      (*d)++;
      d->Show();
     
      delete d;
      return 0;
}

Последний раз редактировалось nikmoon; 13.12.2013 в 06:52.
nikmoon вне форума Ответить с цитированием
Старый 13.12.2013, 09:29   #3
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Цитата:
Сообщение от nikmoon Посмотреть сообщение
Код:
#include <iostream>
using namespace std;
     
    //
    // Абстрактный базовый класс
    //
class CDate
{
    public:
      CDate() {};
      virtual CDate &operator++() = 0;
      virtual CDate &operator++(int) = 0;
      virtual void Show() = 0;
};
     
     
    //
    // Дата, содержащая только ГОД
    //
class CDateYear : public CDate
{
      int m_Year;
     
public:
      CDateYear(int _year) : m_Year(_year) {};
     
      virtual CDate &operator++() { ++m_Year; return *this; };
      virtual CDate &operator++(int) { m_Year++; return *this; };
      virtual void Show() { cout << m_Year << endl; };
};
     
     
    //
    // Дата, содержащая ГОД и МЕСЯЦ
    //
class CDateMonth : public CDateYear
{
      int m_Month;
public:
      CDateMonth(int _year, int _month) : CDateYear(_year), m_Month(_month) {};
     
      virtual CDate &operator++()
      {
        ++m_Month;
        if (m_Month > 12)
        {
          m_Month = 1;
          CDateYear::operator++();
        }
        return *this;
      };
     
      virtual CDate &operator++(int){ ++(*this); };
      virtual void Show() { cout << m_Month << '.'; CDateYear::Show(); };
};
     
     
     
int main()
{
      CDate * d = new CDateMonth(2013, 11);
     
      d->Show();
      ++(*d);
      d->Show();
      (*d)++;
      d->Show();
     
      delete d;
      return 0;
}
После увиденного у меня возник вопрос именно к вам, может я чего не знаю, но я понимаю что перегрузка операторов это те же функции, но делать их виртуальными для меня нонсенс, можете, хотя бы сослаться на какой нибудь источник где подобные конструкции применяются.
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 13.12.2013, 09:58   #4
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Да как Вам сказать, я вот операторы вообще не применяю, хоть виртуальные, хоть невиртуальные, но кто-то же применяет?
Наверное и с такой конструкцией так же.
P.S. Вполне можно применять точно так же, как обычные виртуальные методы.

Последний раз редактировалось nikmoon; 13.12.2013 в 10:10.
nikmoon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ребят выручайте есть перегруженная функция, нужно сделать из нее виртуальную функцию Выручайте23 Помощь студентам 0 12.12.2013 10:36
Выручите ребят нужно сделать Подобие часов... ergans@mail.ru Помощь студентам 2 13.03.2013 12:41
Выручайте ребят! Очень нужно( Nikita3000 Паскаль, Turbo Pascal, PascalABC.NET 2 28.01.2013 21:13
Перегруженная дружественная функция Стремящийся Общие вопросы C/C++ 8 07.05.2012 09:08
Ребят выручайте! murlay Фриланс 27 15.10.2009 20:44