0

私は OOP の初心者です -> 3 つのプライベート変数メンバーを持つクラス Date があり、2 つの方法で日付を出力する必要があります。

  1. 2010/12/25
  2. 2010 年 12 月 25 日

エラーが発生する次のコード:

date.obj : エラー LNK2019: 未解決の外部シンボル "public: __thiscall Date::Date(void)" (??0Date@@QAE@XZ) 関数で参照されている "public: void __thiscall Date::printDate(void)" (? printDate@Date@@QAEXXZ) 私が間違っていることは何ですか? 日付.h

#include<iostream>
#include<string>
#ifndef DATE_H
#define DATE_H
class Date
{
private:
    int day;
    int month;
    int year;
public:
    Date();
    Date(int d, int m, int y)
    {
        day=d;
        month=m;
        year=y;
    }
    int getDay() const {return day;}
    int getMonth() const {return month;}
    int getYear() const {return year;}
    void printDate(void);
};
#endif

日付.cpp

#include"date.h"
#include<iostream>
#include<string>
const int NR=12;
void Date::printDate()
{
    Date newDate;
    std::string Months[]={"January","February", "March" , "April", "May", "June", "July", "August", "September", "Octomber", "November", "December"};
    int position;
    std::string month;
    position=newDate.getMonth();
    for(int i=0;i<NR;i++)
    {
        if(i==position)
        {
            month=Months[i];
        }
    }
    std::cout<<month<<" "<<newDate.getDay()<<" "<<newDate.getYear()<<std::endl;
}

main.cpp

#include "date.h"
#include <iostream>
int main()
{
    int d;
    int m;
    int y;
    std::cout<<"Enter day: ";
    std::cin>>d;
    std::cout<<"Enter month: ";
    std::cin>>m;
    std::cout<<"Enter years: ";
    std::cin>>y;
    Date newDate(d,m,y);
    std::cout<<newDate.getMonth()<<"/"<<newDate.getDay()<<"/"<<newDate.getYear()<<std::endl;
    newDate.printDate();
}
4

3 に答える 3

4

エラーは非常に明白です。クラスのコンストラクターを宣言しましたが、cppファイル内でコンストラクターを定義Dateしていません。

これらのコンストラクターの定義を追加する必要があります。彼らはちょうどこのように見えるかもしれません:

Date::Date() {}

または多分

Date::Date() {
  d = 1;
  m = 1;
  y = 1970;
}

あなたが電話した場合、少なくともナンセンスを印刷しないでしょう

Date myDate;
myDate.printDate();

編集:

Matが提案しているように、可能な場合はコンストラクタ初期化子リストを使用する必要があります。パラメータを使用する他のコンストラクタは、初期化リストで次のようになります。

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

あなたの場合、コンストラクターはで空のコンストラクターを呼び出してdayからmonthそれらyearに値を割り当てますが、初期化リストを使用する場合、コンストラクターは、、およびのパラメーターを使用してコンストラクターを呼び出します。Datedaymonthyear

于 2012-11-11T08:26:32.813 に答える
1

うーん、あなたもここで多くのことを誤解しているかもしれないと思います。まず、メンバーデータ:printDate()関数内で、日付オブジェクトのメンバー変数を直接参照できます。第二に、forループは必要ありません。

months[position]

第三に、そのconst globalは、その配列のサイズを格納するための最良の方法ではありません。配列のサイズを知る必要がある場合は、

months.size()

第4に、その月の配列はメンバーデータになる可能性があるため、printDateが呼び出されるたびに宣言する必要はありません。最後に、ヘッダーファイルにすでにインクルードされているcppファイルには何もインクルードする必要はありません。

したがって、新しいクラスは次のようになります。

Date.h:

#include<iostream>
#include<string>
#ifndef DATE_H
#define DATE_H
class Date
{
private:
    int day;
    int month;
    int year;
    const std::string months[] = {"jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"};
public:
    Date(){}
    Date(int d, int m, int y)
    int getDay() const {return day;}
    int getMonth() const {return month;}
    int getYear() const {return year;}
    void printDate(void);
};
#endif

次にDate.cpp:

#include "Date.h"
Date::Date(int d, int m, int y)
{
    day=d;
    month=m;
    year=y;
}
void Date::printDate(void)
{
    std::cout<<months[month]<<" "<<day<<" "<<year<<std::endl;
}

私はこれのほとんどがあなたがやりたいことには無意味に見えることを知っていますが、C ++はほとんどの部分でやりたいことを何でもできるので、すぐにトラブルに巻き込まれる可能性があります。あなたがそれを始めたときの言語の権利。

于 2012-11-11T08:55:50.647 に答える
0

alestanisは、エラーを取り除くために必要な変更を正しく行っています。しかし、あなたのコードはまだ非常に間違っています。あなたは明らかにオブジェクト指向に苦労しています。

printDateメソッドでは、Dateクラスのメンバー変数を出力するだけです。新しい変数を宣言しないでください。このようにしてください

void Date::printDate()
{
    std::cout<<Months[m]<<" "<<d<<" "<<y<<std::endl;
}

あなたが書いたよりもはるかに単純なコード。

于 2012-11-11T08:43:36.660 に答える