Ambiguous constructor call

I am trying to create a simple date class, but I get an error in my main file that says: "calling an overloaded date () is ambiguous." I am not sure why, because I thought that, since I had different parameters for my constructor, I was fine. Here is my code:

header file:

#ifndef DATE_H #define DATE_H using std::string; class Date { public: static const int monthsPerYear = 12; // num of months in a yr Date(int = 1, int = 1, int = 1900); // default constructor Date(); // uses system time to create object void print() const; // print date in month/day/year format ~Date(); // provided to confirm destruction order string getMonth(int month) const; // gets month in text format private: int month; // 1 - 12 int day; // 1 - 31 int year; // any year int checkDay(int) const; }; #endif 

.cpp file

 #include <iostream> #include <iomanip> #include <string> #include <ctime> #include "Date.h" using namespace std; Date::Date() { time_t seconds = time(NULL); struct tm* t = localtime(&seconds); month = t->tm_mon; day = t->tm_mday; year = t->tm_year; } Date::Date(int mn, int dy, int yr) { if (mn > 0 && mn <= monthsPerYear) month = mn; else { month = 1; // invalid month set to 1 cout << "Invalid month (" << mn << ") set to 1.\n"; } year = yr; // could validate yr day = checkDay(dy); // validate the day // output Date object to show when its constructor is called cout << "Date object constructor for date "; print(); cout << endl; } void Date::print() const { string str; cout << month << '/' << day << '/' << year << '\n'; // new code for HW2 cout << setfill('0') << setw(3) << day; // prints in ddd cout << " " << year << '\n'; // yyyy format str = getMonth(month); // prints in month (full word), day, year cout << str << " " << day << ", " << year << '\n'; } 

and my main.cpp

 #include <iostream> #include "Date.h" using std::cout; int main() { Date date1(4, 30, 1980); date1.print(); cout << '\n'; Date date2; date2.print(); } 
+4
source share
3 answers
 Date(int = 1, int = 1, int = 1900); // default constructor Date(); // uses system time to create object 

They are both called without parameters. It cannot be configured by default because it is ambiguous how to build an object.

Honestly, having these three default options doesn't make much sense. When will I indicate one, but not the others?

+20
source

You must declare two constructors:

 Date(int day, int month, int year) { this->day = day; this->month = month; this->year = year; } Date(); // uses system time to create object { this->day = 1; this->month = 1; this->year = 1900; } 
+1
source
 Date(int = 1, int = 1, int = 1900); // default constructor Date(); // uses system time to create object 

This makes your class not easy. The readability is seriously damaged, and you even get an error in which you should not waste time. Remove unnecessary default options or a second constructor.

0
source

Source: https://habr.com/ru/post/1307431/


All Articles