Using global flags to indicate runtime errors has many disadvantages: Global variables are problematic in multithreaded environments. In addition, programmers might forget to test the value of the global error flag and consequently, the error is not properly handled.
Another method of reporting runtime errors during the construction of an object is to pass an additional argument to the constructor. The constructor assigns a value to that argument, which indicates success or failure.
Date::Date(const char *datestr, int& status){ if (isValid(datestr) == flase) status = EINVALIDDATE;//