J'essaie de créer une classe de date simple, mais j'obtiens une erreur sur mon fichier principal qui dit: "call of overloaded Date() est ambigu". Je ne sais pas pourquoi puisque je pensais aussi longtemps que j'avais des paramètres différents pour mon constructeur, j'allais bien. Voici mon code:Appel de constructeur ambigu
fichier d'en-tête:
#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
fichier .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';
}
et mon 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();
}
Je suis d'accord avec ce qu'a écrit GMan. Mais, aussi si vous déclarez le constructeur par défaut private, le compilateur se plaint de la même erreur. En fait, il essaie d'assembler deux méthodes "identiques" ou identiques. –
Vous devez également inclure vos noms de paramètres dans votre en-tête. Bien qu'ils ne soient pas techniquement nécessaires, il n'y a aucun moyen de savoir si l'utilisateur est censé fournir (mois, jour, année) ou (jour, mois, année) sans creuser dans le fichier source. Je voudrais également appuyer le conseil de GMan de ne pas fournir les paramètres par défaut du tout. Dans quelles circonstances quelqu'un voudrait-il un jour au hasard, tant que c'est en juin? –