Ambiguous constructor call

生来就可爱ヽ(ⅴ<●) 提交于 2021-02-04 17:53:11

问题


I'm trying to create a simple date class, but I get an error on my main file that says, "call of overloaded Date() is ambiguous." I'm not sure why since I thought as long as I had different parameters for my constructor, I was ok. 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();


}

回答1:


Date(int = 1, int = 1, int = 1900); // default constructor
Date(); // uses system time to create object

These are both callable with no parameters. It can't be default constructed, because it's ambiguous how to construct the object.

Honestly, having those three with default parameters doesn't make much sense. When would I specify one but not the others?




回答2:


You should declare the 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;
}



回答3:


Date(int = 1, int = 1, int = 1900); // default constructor
Date(); // uses system time to create object

Having this makes your class not simple anymore. Readability is seriously damaged and you're even getting an error in which you shouldn't be wasting time. Please, remove the useless default parameters or the second constructor.



来源:https://stackoverflow.com/questions/2673687/ambiguous-constructor-call

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!