Solved

use of an overloaded operator of class date

Posted on 2003-12-10
18
583 Views
Last Modified: 2013-12-14
I have this class date:

// date.cpp

#include <iostream>
#include "Date.h"
#include <ctime>


//numero di giorni per ogni mese
const int Date::days[] = {  0, 31, 28, 31, 30, 31, 30,
                           31, 31, 30, 31, 30, 31 };

//costruttore
Date::Date( int m, int d, int y ) { setDate( m, d, y ); }


//set del giorno con controlli
void Date::setDay(int dd)
{

     giornoCheck=1;

     if ( month == 2 && leapYear( year ) )
        { if   ( dd >= 1 && dd <= 29 ) day=dd;
       
          else { day=1; giornoCheck=0;}
      }
   
    else
      { if  ( dd >= 1 && dd <= days[ month ] ) day=dd;
           
        else {day=1; giornoCheck=0;}    
   
      }
}

//set del mese con controlli
void Date::setMonth(int mm)
{
     meseCheck=1;

     if ( mm >= 1 && mm <= 12 ) month= mm;
     else {month= 1; meseCheck=0; }

}

//set dell'anno con controlli
void Date::setYear(int yy)
{
     annoCheck=1;

     if ( yy >= 1900 && yy <= 2100) year = yy;
     else {year = 2002; annoCheck=0; }
}

// Set della data
void Date::setDate( int mm, int dd, int yy )
{
   setMonth(mm);
   setYear(yy);
   setDay(dd);
   
}

// le 3 get

int Date::getMonth() const {
 
  return month;
}

int Date::getDay() const {

return day;
}

int Date::getYear() const {

return year;
}





//per usare l'operatore = anche con le date
bool Date::operator==(const Date & d) const {
 
 return (d.month==month)&&(d.day==day)&&(d.year==year);
 
}

//per usare l'operatore < anche con le date
bool Date::operator<(const Date & d) const {
   
    return (day+ ( month * days[month])+  (365*year) ) < ( d.day + (d.month * d.days[month]) + (365* d.year) );
}

//per usare l'operatore + anche con le date
Date Date::operator+( int g) const {
   
   return Date( month , day+g , year );
}

//per usare l'operatore - anche con le date
Date Date::operator-( int g) const {

 return Date( month , day-g , year );
 
}

//resoconto di validità totale
bool Date::isValid()
{
   
    if ( giornoCheck==1 && annoCheck==1 && meseCheck==1)    return true;
   
    else return false;

}


//singoli resoconti di validità

bool Date::isDayValid()
{
  return giornoCheck;
}

bool Date::isMonthValid()
{
  return meseCheck;
}

bool Date::isYearValid()
{
  return annoCheck;
}



// Operatore di Preincremento
Date & Date::operator++()
{
   helpIncrement();
   return *this;
}

// Operatore di postincremento

Date Date::operator++( int )
{
   Date temp = *this;
   helpIncrement();

   // oggetto temporaneo salvato e non incrementato
   return temp;
}

// aggiunge dei giorni ad una data
const Date &Date::operator+=( int additionalDays )
{
   for ( int i = 0; i < additionalDays; i++ )
      helpIncrement();

   return *this;
}

//Controllo se bisestile o no

bool Date::leapYear( int y ) const
{
   if ( y % 400 == 0 || ( y % 100 != 0 && y % 4 == 0 ) )
      return true;   // bisestile
   else
      return false;  // non bisestile
}

//controlla che il giorno sia compatibile col mese
bool Date::endOfMonth( int d ) const
{
   if ( month == 2 && leapYear( year ) )
      return d == 29; // per febbraio
   else
      return d == days[ month ];
}

//incrementa la data
void Date::helpIncrement()
{
   if ( endOfMonth( day ) && month == 12 ) {  // finito l'anno
      day = 1;
      month = 1;
      ++year;
   }
   else if ( endOfMonth( day ) ) {            // finito il mese
      day = 1;
      ++month;
   }
   else       // tutto ok si può incrementare
      ++day;
}

// per la stampa, overload dell'operatore <<
ostream &operator<<( ostream &output, const Date &d )
{
   static char *monthName[ 13 ] = { "", "Gennaio",
      "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno",
      "Luglio", "Agosto", "Settembre", "Ottobre",
      "Novembre", "Dicembre" };

   output << d.getDay() << ' '
          << monthName[ d.getMonth() ] << ' '<<d.getYear();

   return output;   //operatore a cascata
}

//per l'acquisizione, overload dell'operator >>
istream &operator>>( istream &input, Date &d )
{

  int aux;

  input >> aux;
  d.setDay(aux);
  input.ignore();
  input >> aux;
  d.setMonth(aux);
  input.ignore();
  input >> aux;
  d.setYear(aux);

  return input;

}            


//legge la data del pc
Date Date::today()
{
  time_t tempo_cal( time(NULL) );
  struct tm * tempo_oggi ( localtime(&tempo_cal) );

  return Date( tempo_oggi->tm_mon +1, tempo_oggi->tm_mday,tempo_oggi->tm_year +1900 );
}                    



please give an example of using the operator>> to insert the date
0
Comment
Question by:giggiaus
  • 8
  • 5
  • 5
18 Comments
 
LVL 13

Expert Comment

by:SteH
Comment Utility
operator+ and operator- don't check whether there is an overflow from the day to another month or year.
For the operator>> you should look at what will be in the stream when it was written with operator<<. The month is not an int any more.

Was that your question?
0
 

Author Comment

by:giggiaus
Comment Utility
I want only an example on how  to use operator>> (of class date) to fill in the code.
0
 
LVL 13

Expert Comment

by:SteH
Comment Utility
ifstream is ("yourfile.txt");  // has to be intialized
Date d;

is >> d;

0
 

Author Comment

by:giggiaus
Comment Utility
I have insert your exaple adepted to my code but it give me this error on compilation:

paerse error before '>'
on line is>>d
0
 
LVL 13

Expert Comment

by:SteH
Comment Utility
The following headers <iostream> and <fstream> need to be included. A parse error could be due to an error on the line before like ommiting the ; at the end of a command. Can you show the code of the example?
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
Comment Utility
I could give you an example of a class that is a little bit simpler:


class Date
{
public:
    string date;
};

 
istream& operator>>(istream& is, Date& dt)
{
   is >> dt.date;
   return is;
}



int main()
{
   Date dt;
   cin >> dt;
   cout << dt.date << endl;
   return 0;
}

Note, that operator>> function is defined outside of class.

You could easily adapt your class if you provide an operator=() that takes a const string& as argument
istream& operator>>(istream& is, Date& dt)
{
   string temp;
   is >> temp;  
   dt = temp;     // Here the operator=  applies
   return is;
}

Tell me, if you need more help.

Regards, Alex




0
 

Author Comment

by:giggiaus
Comment Utility
hi Alex,
how can I use the overloaded operartor>>  of my class Date in my code
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
Comment Utility
You see it in


int main()
{
   //  You would need a default constructor setting all members to 0 (invalid date)
   Date dt;          // or use your constructor:    Date dt(0, 0, 0);

   // Print to screen:
   cout << "Please type in a valid date (DD.MM.YYYY): " << endl;

   // Then you may type in the date from keyboard as string, e. g.  "10.12.2003"
   cin >> dt;                        

   // This code is only for test
   cout << dt.day << "." << dt.month << "." << dt.year << endl;
   return 0;
}

Hope, that helps

Alex



0
 

Author Comment

by:giggiaus
Comment Utility
the compiler give me this error:
 
parse error before ">" in   cin >> dt;  .....................
0
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 13

Expert Comment

by:SteH
Comment Utility
Does the error go away when you replace cin with std::cin?
In that case you could add the line
using namespace std;
just after the include lines.

What compiler are you using? Could be easier to follow if one test it on the same one.
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
Comment Utility
That could have two reasons:

1. You forgot to include the iostream header

     #include <iostream>


2. You forgot to include namespace std

    using namespace std;          

That statement you may include in Date.h after all standard includes:

// date.h
#ifndef DATE_H          
#define DATE_H

#include <string>
#include <iostream>
...

using namespace std;

...

class Date
{
     ...
};


#endif

0
 

Author Comment

by:giggiaus
Comment Utility
the error there is again.....
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
Comment Utility
Can you try

     std::cin >> dt;

as STeH has suggested?

If this compiles you should include the line

using namespace std;

directly before

int main()
{
     ...
     cin >> dt;
     ...
}

If the error still exists you should check the line before if the semicolon ';' is present and nothing is between
semicolon and cin.

Regards, Alex

0
 

Author Comment

by:giggiaus
Comment Utility
my compilator is devcpp 4.9.6.0
0
 

Author Comment

by:giggiaus
Comment Utility
and now the error is :
  parse error before "::" in line std::cin>>dt;

 my code is :
.......
do
  cout<<"insert the date(DD.MM.YYYY)";
  std::cin>>dt;
while (dt.isValid());
.................
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
Comment Utility
Add some scope brackets

do
{
  cout<<"insert the date(DD.MM.YYYY)";
  std::cin>>dt;
}
while (dt.isValid());

regards, Alex
0
 
LVL 13

Accepted Solution

by:
SteH earned 20 total points
Comment Utility
do
{  // parenthesis is missing
  cout<<"insert the date(DD.MM.YYYY)";
  std::cin>>dt;
}  // parenthesis is missing
while (dt.isValid());

without {} you only have one line of code for after do and before while.
0
 

Author Comment

by:giggiaus
Comment Utility
Thank you SteH, I solved the prblem....but now i have another problem
see the question: "(difference between two date)  to number of days"
0

Featured Post

Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

Join & Write a Comment

Suggested Solutions

Article by: SunnyDark
This article's goal is to present you with an easy to use XML wrapper for C++ and also present some interesting techniques that you might use with MS C++. The reason I built this class is to ease the pain of using XML files with C++, since there is…
Programmer's Notepad is, one of the best free text editing tools available, simply because the developers appear to have second-guessed every weird problem or issue a programmer is likely to run into. One of these problems is selecting and deleti…
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now