2010-04-20 5 views
4

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(); 


} 
+0

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. –

+0

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? –

Répondre

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

Ce sont là deux appelable sans paramètres. Il ne peut pas être construit par défaut, car il est ambigu de savoir comment construire l'objet. Honnêtement, avoir ces trois avec des paramètres par défaut n'a pas beaucoup de sens. Quand devrais-je en spécifier un mais pas les autres?

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

Cela rend votre classe n'est plus simple. La lisibilité est sérieusement endommagée et vous obtenez même une erreur dans laquelle vous ne devriez pas perdre de temps. Veuillez supprimer les paramètres par défaut inutiles ou le second constructeur.

+3

Je dirais qu'il devrait supprimer la forme qui utilise le temps système si la simplicité est le but. Avoir une date par défaut définie a beaucoup plus de sens que d'en avoir une qui change en fonction du moment où vous l'utilisez. Je préfère 9Feb64 pour mes dates par défaut, mais les détails n'ont pas vraiment d'importance. –

1

Vous devez déclarer les deux constructeurs:

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; 
} 
Questions connexes