公共成员职能问题

时间:2012-11-11 08:24:56

标签: c++ visual-c++

我是OOP的初学者 - >我有一个有3个私有变量成员的类Date,应该用2种方式打印日期:

  1. 2010年12月25日
  2. 2010年12月25日
  3. 以下代码给出错误:

      

    date.obj:错误LNK2019:未解析的外部符号“public:__ thishisall Date :: Date(void)”(?? 0Date @@ QAE @ XZ)在函数“public:void __thiscall Date :: printDate(void)”中引用“(?printDate @ Date @@ QAEXXZ)   我做错了什么?   date.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
    

    date.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();
    }
    

3 个答案:

答案 0 :(得分: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) {}

在您的情况下,构造函数调用day上的空构造函数,monthyear然后为它们分配值,而使用初始化列表时,Date构造函数调用带有[{1}},daymonth参数的构造函数。

答案 1 :(得分:1)

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

months[position]

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

months.size()

第四,这几个月的数组可以是成员数据,因此每次调用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 ++的麻烦,因为它只是让你在大多数情况下做你想做的事情,所以最好学好编码实践并且从一开始就学习语言的力量。

答案 2 :(得分:0)

alestanis是正确的,你需要做出改变以摆脱错误。但是你的代码仍然非常错误。你显然在面向对象方面苦苦挣扎。

printDate方法中,您应该打印出Date类的成员变量。您不应该声明一个新变量。这样做

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

比你写的更简单的代码。