This C++ date class is intended to illustrate how to write a non- trivial class in C++.
Even though this class is non-trivial, it is still simple enough for a new C++ programmer to follow all of the details of the C++ program. Initially the constructor sets the date to current date and format to 1. This class also makes use of #ifndef directive and DOS System calls to get the date.
#ifndef DATE_H #define DATE_H class date { protected: int month; // 1 through 12 int day; // 1 through max_days int year; // 1500 through 2200 static char out_string[25]; // format output area static char format; // format to use for output // Calculate how many days are in any given month // Note - This is a private method which can be called only // from within the class itself int days_this_month(void); public: // Constructor - Set the date to the current date and set // the format to 1 date(void); // Set the date to these input parameters // if return = 0 ---> All data is valid // if return = 1 ---> Something out of range int set_date(int in_month, int in_day, int in_year); // Get the month, day, or year of the stored date int get_month(void) { return month; }; int get_day(void) { return day; }; int get_year(void) { return year; }; // Select the desired string output format for use when the // get_date_string is called void set_date_format(int format_in) { format = format_in; }; // return an ASCII-Z string depending on the stored format // format = 1 Aug 29, 1991 // format = 2 8/29/91 // format = 3 8/29/1991 // format = 4 29 Aug 1991 Military time // format = ? Anything else defaults to format 1 char *get_date_string(void); // return Jan Feb Mar Apr etc. char *get_month_string(void); }; #endif //end of the date.h //date.cpp file implementation // This file contains the implementation for the date class. #include <sprintf.h> // Prototype for sprintf #include <date.h> // Prototypes for the current date #include "date.h" char date::format; // This defines the static data member char date::out_string[25]; // This defines the static string // Constructor - Set date to current date, and // set format to the default of 1 date::date(void) { time_t time_date; struct tm *current_date; time_date = time(NULL); // DOS system call current_date = localtime(&time_date); // DOS system call month = current_date->tm_mon + 1; day = current_date->tm_mday; year = current_date->tm_year + 1900; format = 1; } // Set the date to these input parameters // if return = 0 ---> All data is valid // if return = 1 ---> Something out of range int date::set_date(int in_month, int in_day, int in_year) { int temp = 0; int max_days; // The limits on the year are purely arbitrary if (in_year < 1500) { // Check that the year is between year = 1500; // 1500 and 2200 temp = 1; } else { if (in_year > 2200) { year = 2200; temp = 1; } else year = in_year; } if(in_month < 1) { // Check that the month is between month = temp = 1; // 1 and 12 } else { if (in_month > 12) { month = 12; temp = 1; } else month = in_month; } max_days = days_this_month(); if (in_day < 1) { // Check that the day is between day = temp = 1; // 1 and max_days } else { if (in_day > max_days) { day = max_days; temp = 1; } else day = in_day; } return temp; } static char *month_string[13] = {" ", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; // return Jan Feb Mar Apr etc. char *date::get_month_string(void) { return month_string[month]; } // return an ASCII-Z string depending on the stored format // format = 1 Aug 29, 1991 // format = 2 8/29/91 // format = 3 8/29/1991 // format = 4 29 Aug 1991 Military time // format = ? Anything else defaults to format 1 char *date::get_date_string(void) { switch (format) { // This printout assumes that the year will be // between 1900 and 1999 case 2 : sprintf(out_string, "%02d/%02d/%02d", month, day, year - 1900); break; case 3 : sprintf(out_string, "%02d/%02d/%04d", month, day, year); break; case 4 : sprintf(out_string, "%d %s %04d", day, month_string[month], year); break; case 1 : // Fall through to the default case default : sprintf(out_string, "%s %d, %04d", month_string[month], day, year); break; } return out_string; } int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // Since this is declared in the private part of the class // header is is only available for use within the class. // It is hidden from use outside of the class. int date::days_this_month(void) { if (month != 2) return days[month]; if (year % 4) // Not leap year return 28; if (year % 100) // It is leap year return 29; if (year % 400) // Not leap year return 28; return 29; // It is leap year }