Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

use of an overloaded operator of class date

Posted on 2003-12-10
18
Medium Priority
?
606 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
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 

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 60 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

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Here is a helpful source code for C++ Builder programmers that allows you to manage and manipulate HTML content from C++ code, while also handling HTML events like onclick, onmouseover, ... Some objects defined and used in this source include: …
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 use NetBeans IDE 8.0 for Windows to connect to a MySQL database. Open Services Panel: Create a new connection using New Connection Wizard: Create a test database called eetutorial: Create a new test tabel called ee…
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.

705 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