you didn't say what the problem is. But I see a few problems in the Month class. Whenever the month number changes the month name must also change, and whenever the month name changes the month number must also change. I suggest moving those two large switch statements in the two class constructors into the setmonthName() and setmonthNumber() functions, then call these functions from the constructors and each of the overloaded operators. This will keep the month number and month name class objects synchronized.
An alternate solution would be to not keep the month name anyplace in the class. Only set the month number. When the name is needed, it can easily be obtained from the month number. That way no synchronization is necessary. Change the function setMonthName() to set the month number based on the string passed into the function. There is no reason to keep a copy of that string. And change getMonthName() to return the month name string that is appropriate for the month number. An array of month names makes all that very simple and short -- no switch statement is needed. For example:
std::string months[] = { "January","February" ...}
// assume n >= 1 and n <= 12
string getMonthName(int n) {return months[n-1];}