Ambigu appel du constructeur
Je suis en train de créer une simple classe date, mais j'ai une erreur sur mon fichier principal qui dit, "l'appel de surcharge de Date() est ambigu." Je ne suis pas sûr pourquoi, car je pensais que tant que j'avais des paramètres différents pour mon constructeur, j'étais ok. Voici mon code:
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 que GMan écrit. Mais, aussi, si vous déclarez constructeur par défaut privé, le compilateur se plaint de la même erreur. En fait, il essaie d'assembler deux "même" ou de méthodes identiques.
Vous devez également inclure vos noms de paramètre dans votre en-tête. Alors qu'ils ne sont pas techniquement nécessaire, il n'y a aucun moyen de savoir si l'utilisateur est censé fournir (jour, mois, année) ou le (jour, mois, année) sans creuser dans le fichier source. Je voudrais également deuxième GMan de conseils à propos de ne pas fournir les paramètres par défaut. Dans quelles circonstances serait quelqu'un veux quelques jours hasard, tant que sa en juin?
Vous devez également inclure vos noms de paramètre dans votre en-tête. Alors qu'ils ne sont pas techniquement nécessaire, il n'y a aucun moyen de savoir si l'utilisateur est censé fournir (jour, mois, année) ou le (jour, mois, année) sans creuser dans le fichier source. Je voudrais également deuxième GMan de conseils à propos de ne pas fournir les paramètres par défaut. Dans quelles circonstances serait quelqu'un veux quelques jours hasard, tant que sa en juin?
OriginalL'auteur Crystal | 2010-04-20
Vous devez vous connecter pour publier un commentaire.
Ce sont les deux remboursables sans paramètres. Il ne peut pas être par défaut construits, parce que c'est ambigu comment construire l'objet.
Honnêtement, ceux-ci ayant trois avec les paramètres par défaut ne fait pas beaucoup de sens. Quand dois-je spécifier un, mais pas les autres?
OriginalL'auteur GManNickG
Vous devez déclarer les deux constructeurs:
OriginalL'auteur Jitendra Sanghani
Avoir cela rend votre classe non plus aussi simple. La lisibilité est sérieusement endommagé et que vous êtes à même de faire une erreur dans laquelle vous ne devriez pas perdre de temps. S'il vous plaît, supprimer ce qui est inutile, les paramètres par défaut ou le deuxième constructeur.
OriginalL'auteur Daniel Daranas