Purpose: Implement new relational operators and
arithmetic-like operators to enhance the DateType
class and provide console or file input/output capability through the global
operators >> and <<.
*********************************************************
Step 0: Download a sample
executable, a revised header file, and a new .cpp
file for testing
Download
this zip file containing (i) a sample
executable (DateType_Program2_Demo.exe)
showing what your enhanced DateType class
should be able to do by the end of this assignment, (ii) a Visual C++ 2013 project folder containing in the program
folder a new updated header file (DateType.h) for
the enhanced DateType class we are going to implement, an empty source code file (DateType.cpp), and another source code file (DateTest.cpp)
for testing the implementation of the new things in DateType
class and checking the behavior of DateType objects.
*********************************************************
Step 1: Create a new project
Replace the empty DateType.cpp in the program folder you have downloaded in Step 0 above with the DateType.cpp from your project for programming #1B. You need to add C++ code into DateType.cpp to implement the enhanced version of the DateType class as described in DateType.h. So your C++ project still has the following three files:
DateType.h, which specifies all the member functions (both
the old ones and the newly added) and other information in the enhanced
DateType class,
DateType.cpp, which provides
the implementation of the enhanced DateType class, and
DateTest.cpp, which contains the main function for testing
the implementation of the enhanced DateType class.
Step 2: Explore the new things added into the DateType
class
In DateType.h, examine the new declaration added
into the DateType class such as (i) new member functions and operators and (ii) declaration of global functions as friends of the DateType class to allow these global functions to access
the private data members of DateType objects. More
specifically, see the following:
Class DateType
{
...
//**********************************************************************
// The
following are new public member functions added into DateType
//**********************************************************************
void
SetRandomDate();
//set the contents to a valid random date
bool
operator> (const DateType &
aDate);
//Define the relational operator >
bool
operator< (const DateType &
aDate);
//Define the relational operator <
bool
operator== (const DateType &
aDate);
//Define the relational operator ==
bool
operator!= (const DateType &
aDate);
//Define the relational operator !=
bool operator>=
(const DateType & aDate);
//Define the relational operator >=
bool operator<= (const DateType
& aDate);
//Define the relational operator <=
DateType operator+ (int
numDays);
//Define the arithmetic operator + such that it will
// return a separate DateType
object recording a date
// that is numDays
into the future from the DateType object
// performing this operation.
//Note that the
date recorded in the DateType object performing
// this
operation should remain unchanged.
//For example,
in the following the output should be
// 1/1/2010 and 1/3/2010 respectively.
// DateType d1(1,1, 2010)), d2;
// d2
= d1+2;
// d1.PrintDate();
// d2.PrintDate();
DateType operator- (int
numDays);
//Define the arithmetic operator - such that it will
// return a separate DateType
object recording a date
// that is numDays
into the past from the DateType object
// performing this operation.
//Note that the
date recorded in the DateType object performing
// this
operation should remain unchanged.
//For example,
in the following the output should be
// 1/3/2010 and 1/1/2010 respectively.
// DateType d1(1,3, 2010)), d2;
// d2
= d1-2;
// d1.PrintDate();
// d2.PrintDate();
int operator- (const DateType
& aDate);
//Define the arithmetic operator - such that
// it will calculate and return the number days
to go
// from the DateType
object aDate passed as the argument
// to this DateType
object now performing this operation.
//The
number returned should be positive if aDate records
// a date earlier than that recorded in this
date,
//The
number returned should be negative if aDate records
// a date later than that recorded in this date,
//The
number returned should be 0 if aDate records records
// the same date as that recorded in this date.
//For example,
in the following, 2 should be the output generated.
// DateType d1(2,16, 2010), d2(2, 14,
2010);
// cout << d1-d2;
//***********************************************************************
// The following two new global functions as I/O operators for DateType.
// They
are NOT member functions in DateType, but are
declared as friends
// so that they can access the private data
members of DateType objects
// for input and
output.
//***********************************************************************
friend
ostream & operator<<
(ostream & output, const DateType &
aDate);
//For example,
in the following 2/16/2010 should be the output:
// DateType d1(2,16, 2010);
// cout << d1;
//For example,
in the following
// 2/16/2010
2/16/2010 should be the output:
// DateType d1(2,16, 2010);
// cout << d1 << " " << d1;
//
//For example,
in the following 2 14 2010 should be written
// into the file someFile.txt.
// DateType d2(2, 14, 2010); ofstream fout;
// fout.open("someFile.txt");
// fout << d2;
//************************************************************
// Correspondingly in DateType.cpp,
you should implement it as
// ostream & operator<< (ostream
& output, const DateType & aDate)
// { // Your
code
// // ...
// //Remember to return output in the
end:
// return output;
// }
// Note that in your code you want to
check
// whether
output is a reference to cout or not by
// if (&output == &cout)
…
// If output is indeed a reference to cout,
// your
code should print out day, month, year separated by '/'.
// output << month <<
'/' << day << '/'
<< year;
// If output is NOT a reference to cout,
// it
is a reference to an ostream object for file output and
// your
code should simply do
// output << month << ' ' << day << ' ' << year;
// write out day, month, year separated by ' '.
//************************************************************
friend istream & operator>> (istream & input, DateType & aDate);
//For example,
in the following the user will be prompted
// to enter the day, month, and year as a date
stored in d3
// just like how the ReadDate
method should work.
// DateType d3;
// cin >> d3;
//For example,
in the following the user will be prompted to
// enter two dates, first one to be stored in
d1
// while the second one to be stored in d3.
// cin>> d1 >> d3;
//
//For example,
// given the contents of 2 14 2010 in the file someFile.txt,
// in the following 2 14 2010 should be read
// into the data members month, day, year of d4
// DateType d4; ifstream fin;
// fin.open("someFile.txt");
// fin
>> d4;
//************************************************************
// Correspondingly in DateType.cpp,
you should implement it as
// istream & operator>> (istream
& input, DateType & aDate)
// { // Your
code
// // ...
// //Remember to return input in the end:
// return input;
// }
// Note that in your code you want to
check
// whether
input is
a reference to cin or not by
// if (&input == &cin) …
// If input is indeed a reference to cin,
// you
can simply call the ReadDate method
// to
prompt the user with messages on the screen
// to enter day, month, year separately from the keyboard,
// which will check and ensure the validity of date.
// If input is NOT a reference to cin,
// (i) it is a reference to an istream
object for
file input and
// your
code should read the information of
// day, month, and year into some local variables you declared
// through input without prompting the user such as:
// input >> tempM
>> tempD >> tempYear;
// (ii) you should then check whether they compose a valid date:
// if yes, update the day, month, and year in aDate;
// if no, keep the day, month, and year in aDate unchanged.
//************************************************************
}
*********************************************************
Step 3: Implementation and testing
Implementation: Implement all the new member functions (and operators) in your own DateType.cpp :
Testing: The code in the main function in DateTest.cpp provide a test menu to extensively test your implementation. You should do so to make sure it works fine for each new feature mentioned above. Find another person in the class to play with your code for further testing before you submit the source code files and the self-evaluation report.