C++ 如何在此程序中显示返回枚举类型数据的函数

C++ 如何在此程序中显示返回枚举类型数据的函数,c++,enums,C++,Enums,我已经实现了Date类,该类旨在显示不同的日期格式。我在d1.Display_version3有问题;它无法正确返回枚举数据。如何更改代码?这是我的密码: //Decleration of Class Date. #ifndef DATE_H #define DATE_H class Date{ private: int day; int month; int year; enum Month {

我已经实现了Date类,该类旨在显示不同的日期格式。我在d1.Display_version3有问题;它无法正确返回枚举数据。如何更改代码?这是我的密码:

  //Decleration of Class Date.

#ifndef DATE_H
#define DATE_H
class Date{

    private:

        int day;
        int month;
        int year;
        enum Month {
            January, February, March, April, May, June,
            July, August,September,October, November, December
        };
        Month m;
        int checkdate(int);

    public:
        /*Overloading Constructors*/
        Date(int = 1, int = 1, int = 1900);//constructor 1
        Date(int = 1, Month = January, int = 1900);//constructor 2
        /*Read functions*/
        int read_date() const;
        int read_month() const;
        int read_year() const;
        Month read_month_ex() const;
        /*Display Functions*/
        void Display_version1() const;//mm/dd/yy
        void Display_version2() const;//dd.mm.YYYY
        void Display_version3() const;//May 14,1992
};
#endif

/*Decleration of the Class Members*/

#include<iostream>

using std::cout;
using std::endl;

#include "date.h"

Date::Date(int dd, int mm, int yy){

    month = (mm>0 && mm<12) ? mm : 1;//ensure that month is valid
    year = yy;
    day=checkdate(dd);

}
Date::Date(int dd, Month mm, int yy){

    m = (mm>January && mm<December) ? mm : January;//ensure that month is valid
    year = yy;
    day = checkdate(dd);

}
int Date::checkdate(int dd){

    static const int daysinamonth[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (dd>0 && dd <= daysinamonth[month]);
    return dd;
    if (month==2 && dd==29 &&(year%400==0 || (year%4==0 && year%100!=0)));
    return dd;
    return 1;//if it is not valid date.
}
int Date::read_date() const{
    return day;
};
int Date::read_month() const{
    return month;
};
int Date::read_year() const{
    return year;
};
Date::Month Date::read_month_ex() const{
    return m;
};
void Date::Display_version1() const{

    cout << read_month() << "." << read_date() << "." << (read_year()-1900) << endl;

};//mm/dd/yy
void Date::Display_version2() const{

    cout << read_date() << "." << read_month() << "." << read_year() << endl;

};//dd.mm.YYYY
void Date::Display_version3() const{


    cout << read_month_ex() <<" "<< read_date() << "," << read_year() << endl;

};//May 14,1992
#include<iostream>

using std::cout;
using std::endl;

#include"date.h"

int main(){

    Date d1(5, 10, 1990);

    d1.Display_version1();//mm/dd/yy
    d1.Display_version2();//dd.mm.YYYY
    d1.Display_version3();//display as May 14,1992, problem is here!!!

    while (1);
}

将返回类型从enum更改为const char*:

你打字的时候

enum Month {
    January, February, March, April, May, June,
    July, August,September,October, November, December
};
编译器实际上不会在程序中的任何位置放置类似于“二月”的字符串,除非可能在单独的调试数据部分中。它所做的只是了解到Date::Month是一种新类型,而像Date::Junary这样的枚举数就是这种类型的值,用数字表示。因为您让它选择数字,所以它使用一月=0,二月=1。。。12月11日。就运行的代码而言,这些值几乎只是数字,它不知道它们被调用了什么,就像int x是一个存储区域,程序也不知道它的名称是x

所以你必须自己在某处提供字符串。这里最简单的方法可能是使用数组,因为数值顺序为0到11:

class Date {
public:
    const char* read_month_ex() const;
// ...
private:
    static char const* const month_names[12];
};

char const* const Date::month_names[12] = {
    "January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December"
};

const char* Date::read_month_ex() const {
    return month_names[m];
}

在编译时,你不会显示他们最知道的函数,并且在运行时不完全存在。为了显示一些EnUM值,你必须做一个函数显示它,考虑使用一个开关,或者一个常量静态或全局数组的常量字符串…
class Date {
public:
    const char* read_month_ex() const;
// ...
private:
    static char const* const month_names[12];
};

char const* const Date::month_names[12] = {
    "January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December"
};

const char* Date::read_month_ex() const {
    return month_names[m];
}