Solved

use of an overloaded operator of class date

Posted on 2003-12-10
18
596 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

Suggested Solutions

Title # Comments Views Activity
How to split this in C++ 4 129
Better understanding on C++ Class serialization and formats 9 106
PHPStorm debugging issues 1 96
JavaFX TableView not displaying correctly 3 162
  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

751 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