【问题标题】:public member function issue公共成员函数问题
【发布时间】:2012-11-11 08:24:56
【问题描述】:

我是 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();
}

【问题讨论】:

    标签: c++ visual-c++


    【解决方案1】:

    错误很明显:您为 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) {}
    

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

    【讨论】:

    • @Mat 仍然有很多人没有 C++11(包括我在内!)
    • 成员初始化列表不是新的 C++11。我的意思是:Date::Date() : d(1), ... {}
    • Mat 可能指的是构造函数初始化列表。
    • @Mat 哦,我明白了。他已经有一个参数构造函数,所以它并没有真正回答这个问题。他的代码中缺少的是空的构造函数,那里没有初始化列表。
    • 它本身并不能回答问题,但它会让你的答案更好。除非有特殊原因不使用,否则首选使用初始化列表。
    【解决方案2】:

    嗯,我想你也可能在这里误解了很多东西。首先,成员数据:在您的 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
    

    然后是 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++ 时遇到麻烦,因为它只是让你在大多数情况下做任何你想做的事情,因此最好学习良好的编码实践并从一门语言开始学习它的力量。

    【讨论】:

      【解决方案3】:

      alestanis 是正确的,您需要进行更改以消除错误。但是您的代码仍然非常错误。您显然在为面向对象而苦苦挣扎。

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

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

      比你写的简单得多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-17
        • 1970-01-01
        • 2013-06-14
        • 2010-10-04
        • 1970-01-01
        • 1970-01-01
        • 2010-10-14
        相关资源
        最近更新 更多