2009-07-14 5 views
0

Ich versuche, die add_day Funktion Arbeit zu machen, aber ich bin ein paar Probleme haben. Beachten Sie, dass ich keine Änderungen an der struct vornehmen kann (es ist sehr simpel), weil der Zweck der Übung darin besteht, das Programm mit dem zu arbeiten, was gegeben wird. Der Code istKlasse Problem, das Hinzufügen eines Tages

#include "std_lib_facilities.h" 

struct Date{ 
     int y, m, d; 
     Date(int y, int m, int d); 
     void add_day(int n); 
}; 

void Date::add_day(int n) 
{ 
    d+=n; 
} 

ostream& operator<<(ostream& os, const Date& d) 
{ 
     if(d.m<1 || d.m>12 || d.d<1 || d.d>31) cout << "Invalid date: "; 
     return os << '(' << d.y 
        << ',' << d.m 
        << ',' << d.d << ')'; 
} 

int main() 
{ 
    Date today(1978,6,25); 
    today.add_day(1); 
    cout << today << endl; 
    keep_window_open(); 
} 

Ich bin ein Linker-Fehler erhalten, die undefined reference to Date::Date(int,int,int) sagt, aber ich kann nicht herausfinden, was los ist. Es scheint, als ob es etwas mit dem Date Konstruktor zu tun hat, aber ich bin mir nicht sicher was.

Ich würde auch für morgen in einer Codezeile hinzufügen, wie

Date tomorrow = today.add_day(1); 

aber ich habe das Gefühl, dass da add_day ein Hohlraumtyp ist, wird ein Konvertierungs Problem sein.

Jede Hilfe wäre willkommen - danke.

P.S. Mach dir keine Sorgen über das Hinzufügen von Tagen am Ende des Monats. Es ist etwas, das später implementiert wird.

Antwort

6

Der Linker Fehler ist, weil Sie den Konstruktor nicht definieren, sind.

Date::Date(int yr, int mo, int day) : y(year), m(month), d(day) 
{ 
} 

Für die Frage add_day: Sie sind richtig, dass Sie den Rückgabetyp ändern müssen. Es sollte ein Date-Objekt zurückgeben. Sie können ein neues Date-Objekt erstellen und es mit dem Tag-Wert inkrementiert zurückgeben oder nur den Tag-Wert erhöhen und * dies zurückgeben.

2

Sie haben einen Konstruktor Datum erklärt :: Datum (int, int, int), und nannte es, aber es gibt keine Definition dafür. Ergo, Linkerfehler.

2

Speziell auf die Fehler Sie bekommen:

1) Sie definieren einen Nicht-Standard-Konstruktor (das heißt, eine, die drei Parameter bekommt). Dies wird nicht automatisch vom Compiler generiert, Sie müssen also eine Implementierung bereitstellen. Deshalb erhalten Sie den Linkfehler.

Ich erinnere mich nicht vollständig die C++ Syntax, aber es ist so etwas wie diese:

Date::Date(int _y, int _m, int _d):y(_y),m(_m),d(_d){} 

2) Was die Semantik von add_day ist? Wenn add_day das Datumsobjekt verwendet, auf das es aufgerufen wird, und es ändert, was genau möchten Sie zurückgeben? Es muss keine Leere sein, Sie können definieren, was Sie wollen, aber denken Sie darüber nach, was die intuitivste Semantik ist.

Vielleicht möchten Sie eine Funktion namens createTomorrow(), die das aktuelle Date-Objekt nicht ändert, sondern stattdessen ein neues Date-Objekt erstellt, auf das entsprechende Datum setzt (egal außer Tag) und es dann zurückgibt.

2

Der Date-Konstruktor ist nicht definiert. Sie können es als so etwas wie folgt definieren:

Date::Date(int y, int m, int d) 
{ 
    this.y = y; 
    this.m = m; 
    this.d = d; 
} 
4

Sie haben einen Konstruktor

erklärt
Date(int y, int m, int d); 

aber man kann nie die Definition für den Konstruktor geschrieben.Vermutlich werden Sie einige Code wie

Date::Date(int y, int m, int d):y(y),m(m),d(d) 
{ 
} 

Zusätzlich hinzuzufügen,

Date tomorrow = today.add_day(1); 

Date::add_day(int) müssen einen neuen Tag für diese Rückkehr zu arbeiten.

Date Date::add_day(int n) 
{ 
    d+=n; 
    return *this; 
} 

Dadurch wird eine Kopie von this zurückzukehren, nachdem es zu ändern.

+0

zurückkehren Generell würde kehren wir eine konstante Referenz statt einer Kopie, die gleiche Funktionalität, sondern mehr besonders effizient mit zeitaufwendigem Kopieren (weniger ein Problem hier). – DeusAduro

0

Sie deklarieren den Konstruktor der Klasse Date mit drei Parametern, definieren ihn jedoch niemals.

Sie möchten eine Zeile wie Date::Date(int yy, int mm, int dd) : y(yy), m(mm), d(dd) {}

Und die zweite Frage addieren - add_day würde Date oder Date &

Verwandte Themen