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

主文件

#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

错误很明显:您为类声明了构造函数,Date但没有在 cpp 文件中定义它们。

您应该为这些构造函数添加定义。他们可能看起来像这样:

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) {}

在您的情况下,您的构造函数在 上调用空构造函数daymonth然后为它们赋值,而在使用初始化列表时,year构造函数调用Date带有参数的构造函数 forday和。monthyear

于 2012-11-11T08:26:32.813 回答
1

嗯,我想你也可能在这里误解了很多东西。首先,成员数据:在您的 printDate() 函数内部,您可以直接引用日期对象的成员变量。其次,你不需要那个 for 循环,你可以说

months[position]

第三, const global 不是存储该数组大小的最佳方式。如果您需要知道数组的大小,您可以调用

months.size()

第四,月份数组可以是成员数据,因此您无需在每次调用 printDate 时都声明它。最后,您不需要在 cpp 文件中包含任何已包含在头文件中的内容。

所以你的新类应该是这样的:

日期.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

然后日期.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 回答