Solved

use of an overloaded operator of class date

Posted on 2003-12-10
18
599 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 8
  • 5
  • 5
18 Comments
 
LVL 13

Expert Comment

by:SteH
ID: 9911630
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
ID: 9912369
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
ID: 9912419
ifstream is ("yourfile.txt");  // has to be intialized
Date d;

is >> d;

0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:giggiaus
ID: 9912691
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
ID: 9912803
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
ID: 9912805
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
ID: 9913047
hi Alex,
how can I use the overloaded operartor>>  of my class Date in my code
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 9913165
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
ID: 9913348
the compiler give me this error:
 
parse error before ">" in   cin >> dt;  .....................
0
 
LVL 13

Expert Comment

by:SteH
ID: 9913415
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
ID: 9913436
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
ID: 9913510
the error there is again.....
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 9913569
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
ID: 9913588
my compilator is devcpp 4.9.6.0
0
 

Author Comment

by:giggiaus
ID: 9913665
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
ID: 9913710
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
ID: 9913715
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
ID: 9921079
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

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Many modern programming languages support the concept of a property -- a class member that combines characteristics of both a data member and a method.  These are sometimes called "smart fields" because you can add logic that is applied automaticall…
This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
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…
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

622 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