0

私はC++とオブジェクト指向プログラミングに慣れていないので、この質問についてはご容赦ください。入力した日付がうるう年かどうかを判断し、2つの日付の間の長さを計算する日付プログラムを作成しています。これが私のコードです。ヘッダーファイルDate.hと、2つのソースファイルDate.cppおよびmain.cppがあります。

Date.h

#include <iostream>
using namespace std;
class Date {
private:
static const int month_nb;
static const unsigned char month_days[];
static const unsigned char month_daysLeap[];
protected:
static bool testLeap(const int year_);
bool isLeap;
int year;
int month;
int day;
public:


Date(const int month_,const int day_,const int year_);


~Date(){};


int get_month() const {return month;}
int get_day() const {return day;}
int get_year() const {return year;}


void set_month(int m){month = m;}
void set_day(int d){day = d;}
void set_year(int y){year = y;}


bool testLeap() const;
void out() const;
bool testValid() const;
int operator-(const Date & date) const;
static int Julian(const Date & date1,const Date & date2);
static double CountACT_365(const Date & date1,const Date & date2);
static int Count30_360L(const Date & date1,const Date & date2);
static double Count30_360(const Date & date1,const Date & date2);
double CountACT_365(const Date & date) const;
int Count30_360L(const Date & date) const;
double Count30_360(const Date & date) const;
};
inline bool operator==(const Date& d1,const Date& d2)
{
return d1.get_month()==d2.get_month()
&& d1.get_day()==d2.get_day() && d1.get_year()==d2.get_year();
}
ostream& operator<<(ostream& os,const Date& d);

Date.cpp

#include <iostream>
#include "Date.h"
using namespace std;
const int Date::month_nb = 12;
const unsigned char Date::month_days[] = {31,28,31,30,31,30,31,31,30,31,30,31};
const unsigned char Date::month_daysLeap[] = {31,29,31,30,31,30,31,31,30,31,30,31};
Date::Date(const int month_, const int day_, const int year_)
{
year = year_; month = month_; day = day_;
isLeap = testLeap();
}
bool Date::testLeap(const int year_)
{
//if the year is not a multiple of 4, this is not a leap year
if(year_ % 4 != 0) return false;
//if the year is a multiple of 100, this is not a leap year,
//except if it is a multiple of 400.
if(year_ % 100 == 0) {
return year_ % 400 == 0;
}
return true;
}
bool Date::testLeap() const {
return testLeap(year);
}
void Date::out() const
{
cout << (int)month <<"/"<< (int)day <<"/"<< year << endl;
}
bool Date::testValid() const {
return (1 <= month && month <= month_nb && 1 <= day
&& ((isLeap && day <= month_daysLeap[month-1])
|| (!isLeap && day <= month_days[month-1])));
}
ostream& operator<<(ostream& os,const Date& d) {
return os<<d.get_month()<<'/'<<d.get_day()<<'/'<<d.get_year();
}

main.cpp

 #include <iostream>
#include "Date.h"
using namespace std;
int Count30_360L(Date date1, Date date2) {
return 360 * (int) (date2.get_year() - date1.get_year())
+ 30 * (int) (date2.get_month() - date1.get_month())
+ (date2.get_day() - date1.get_day());
}
double Count30_360(Date date1, Date date2) {
return (double) Count30_360L(date1, date2) / 360.0;
}
int main() {

    Date SBday = Date(8,24,1971);
    Date CBday = Date(9,28,1996);
    cout <<"Time elapsed " << CBday - SBday<<endl;
    cout << "Q: was 8/24/1971 in a leap year? A: "<<SBday.testLeap()<<endl;
    cout <<"Count30_360L(SBday,CBday) = "<< Count30_360L(SBday,CBday)<<endl;
    cout <<"Count30_360(SBday,CBday) = "<< Count30_360(SBday,CBday)<<endl;
    cout <<"CountACT_365(SBday,CBday) = "<< Count30_360L(SBday,CBday)<<endl;
    cout <<"CBday.Count30_360L(SBday) = "<< CBday.Count30_360L(SBday)<<endl;
    cout <<"CBday.Count30_360(SBday) = "<< CBday.Count30_360(SBday)<<endl;
    return 0;
    }

次のエラーメッセージが表示されます。

g ++ -static-libgcc -static-libstdc ++ -o HW1_2.exe main.o Date.o

main.o:関数 `main'内:

... Debug /../ main.cpp:24: `Date :: operator-(Date const&)const'への未定義の参照

... Debug /../ main.cpp:29: `Date :: Count30_360L(Date const&)const'への未定義の参照

... Debug /../ main.cpp:30: `Date :: Count30_360(Date const&)const'への未定義の参照

誰か助けてもらえますか?ありがとう!

4

1 に答える 1

1
  • ... Debug /../ main.cpp:24: `Date :: operator-(Date const&)const'への未定義の参照

int operator-(const Date & date) const;Date.hで宣言しましたが、定義していません。

  • ... Debug /../ main.cpp:29: `Date :: Count30_360L(Date const&)const'への未定義の参照

宣言しint Count30_360L(const Date & date) const;ましたが、定義しませんでした(free関数を定義しましたint Count30_360L(Date date1, Date date2))。

  • ... Debug /../ main.cpp:30: `Date :: Count30_360(Date const&)const'への未定義の参照

繰り返しますが、Data.hで宣言double Count30_360(const Date & date) const;しましたが、定義していません(ただし、free関数を定義しましたdouble Count30_360(Date date1, Date date2))。

関数はすべて次の場所で参照されmain()ます:

  • Bday - SBday
  • CBday.Count30_360L(SBday)
  • CBday.Count30_360(SBday)

Date::これらのメンバー関数を(Date.cppで)定義する必要があります。

また:

using namespace std;

これはヘッダーファイルではお勧めできません。「名前空間stdの使用」が悪い習慣と見なされるのはなぜですか?を参照してください。

また、コードをインデントする場合は、読みやすさにも大いに役立ちます。

于 2013-02-16T04:07:44.077 に答える