C++ 公职人员职能问题

C++ 公职人员职能问题,c++,visual-c++,C++,Visual C++,我是OOP->的初学者,我有一个包含3个私有变量成员的类日期,a应该以2种方式打印日期: 2010年12月25日 2010年12月25日 下面的代码显示了该错误: date.obj:错误LNK2019:未解析的外部符号“public:u thiscall date::date(void)”(?0日期)@@QAE@XZ)在函数“public:void _thiscall Date::printDate(void)”中引用(?printDate@Date@@QAEXZ) 我做错了什么? 日期:h #

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

  • 2010年12月25日
  • 2010年12月25日
  • 下面的代码显示了该错误:

    date.obj:错误LNK2019:未解析的外部符号“public:u thiscall date::date(void)”(?0日期)@@QAE@XZ)在函数“public:void _thiscall Date::printDate(void)”中引用(?printDate@Date@@QAEXZ) 我做错了什么? 日期:h

    #包括
    #包括
    #ifndef日期
    #定义日期
    上课日期
    {
    私人:
    国际日;
    整月;
    国际年;
    公众:
    日期();
    日期(整数d,整数m,整数y)
    {
    d=d;
    月=m;
    年份=y;
    }
    int getDay()常量{return day;}
    int getMonth()常量{return month;}
    int getYear()常量{返回年份;}
    作废打印日期(作废);
    };
    #恩迪夫
    
    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;
    }
    
    #包括“date.h”
    #包括
    #包括
    常数int NR=12;
    作废日期::打印日期()
    {
    日期newDate;
    std::string Months[]={“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
    内部位置;
    std::字符串月份;
    position=newDate.getMonth();
    
    对于(int i=0;i而言,错误非常明显:您
    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) {}
    

    在您的情况下,构造函数在
    调用空构造函数,然后为它们赋值,而在使用初始化列表时,
    日期
    构造函数使用
    的参数调用构造函数,错误是非常清楚:您
    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) {}
    

    在您的情况下,构造函数在
    调用空构造函数,然后为它们赋值,而在使用初始化列表时,
    日期
    构造函数调用构造函数,并使用
    的参数正确的做法是进行必要的更改以消除错误。但您的代码仍然非常错误。显然,您正在与面向对象进行斗争

    printDate
    方法中,您应该只打印出日期类的成员变量。您不应该声明新变量。按如下方式执行

    void Date::printDate()
    {
        std::cout<<Months[m]<<" "<<d<<" "<<y<<std::endl;
    }
    
    void Date::printDate()
    {
    
    alestanis对于消除错误所需的更改是正确的。但是您的代码仍然是非常错误的。显然,您正在与面向对象进行斗争

    printDate
    方法中,您应该只打印出日期类的成员变量。您不应该声明新变量。按如下方式执行

    void Date::printDate()
    {
        std::cout<<Months[m]<<" "<<d<<" "<<y<<std::endl;
    }
    
    void Date::printDate()
    {
    
    std::coutHmmmm,我想你可能也误解了很多东西。首先,成员数据:在printDate()函数中,你可以直接引用date对象的成员变量。其次,循环不需要这些,你可以说

    months[position]
    
    第三,const global不是存储数组大小的最佳方法。如果需要知道数组的大小,可以调用

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

    因此,您的新类应该如下所示:

    Date::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
    
    #包括
    #包括
    #ifndef日期
    #定义日期
    上课日期
    {
    私人:
    国际日;
    整月;
    国际年;
    const std::字符串月份[]={“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
    公众:
    日期(){}
    日期(整数d,整数m,整数y)
    int getDay()常量{return day;}
    int getMonth()常量{return month;}
    int getYear()常量{返回年份;}
    作废打印日期(作废);
    };
    #恩迪夫
    
    然后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;
    }
    
    #包括“Date.h”
    日期:日期(整数d,整数m,整数y)
    {
    d=d;
    月=m;
    年份=y;
    }
    作废日期::打印日期(作废)
    {
    
    std::coutHmmmm,我想你可能也误解了很多东西。首先,成员数据:在printDate()函数中,你可以直接引用date对象的成员变量。其次,循环不需要这些,你可以说

    months[position]
    
    第三,const global不是存储数组大小的最佳方法。如果需要知道数组的大小,可以调用

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

    因此,您的新类应该如下所示:

    Date::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
    
    #包括
    #包括
    #ifndef日期
    #定义日期
    上课日期
    {
    私人:
    国际日;
    整月;
    国际年;
    常量标准::字符串月份[]={“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”