Неоднозначный вызов конструктора - PullRequest
5 голосов
/ 20 апреля 2010

Я пытаюсь создать простой класс дат, но я получаю сообщение об ошибке в моем главном файле, которое говорит: «вызов перегруженного Date () неоднозначен» Я не уверен, почему, так как я думал, что пока у меня были разные параметры для моего конструктора, я был в порядке. Вот мой код:

заголовочный файл:

#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 файл

#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';
}

и мой 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();


}

Ответы [ 3 ]

21 голосов
/ 20 апреля 2010
Date(int = 1, int = 1, int = 1900); // default constructor
Date(); // uses system time to create object

Оба они могут вызываться без параметров. Он не может быть создан по умолчанию, потому что это неоднозначно, как создать объект.

Честно говоря, иметь эти три с параметрами по умолчанию не имеет особого смысла. Когда я могу указать одно, а не другие?

1 голос
/ 08 января 2014

Вы должны объявить два конструктора:

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;
}
0 голосов
/ 20 апреля 2010
Date(int = 1, int = 1, int = 1900); // default constructor
Date(); // uses system time to create object

Наличие этого делает ваш класс уже не простым. Читаемость серьезно нарушена, и вы даже получаете ошибку, из-за которой не стоит тратить время. Удалите ненужные параметры по умолчанию или второй конструктор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...