我在哪里放置我的班级所需的常量以保持全球空间免费?

5 c++ global-variables

第一:我知道如何编写程序,所以我不是在寻求帮助.但是,我正在粘贴问题的副本,以便您可以看到分配所需的内容.我的问题是专门针对哪里放置变量以防止一切变得全球化?

分配

设计一个名为Date的类,它具有存储月,日和年的整数数据成员.该类应具有三参数默认构造函数,该构造函数允许在创建新Date对象时设置日期.如果用户创建Date对象而不传递任何参数,或者传递的任何值无效,则应使用默认值1,1,2001(即2001年1月1日).该类应具有成员函数,以下列格式打印日期:

3/15/10
March 15, 2010
15 March 2010
Run Code Online (Sandbox Code Playgroud)

问题

1)老师已经指示我们避免在我们的代码中使用幻数,所以第一个问题是关于我对默认构造函数的实现:

// These are outside the class.
#define DEFAULT_MONTH 1
#define DEFAULT_DAY   1
#define DEFAULT_YEAR  2001

// This is inside the class definition.
Date(int month = DEFAULT_MONTH, int day = DEFAULT_DAY, int year = DEFAULT_YEAR);
Run Code Online (Sandbox Code Playgroud)

它是否正确?

2)类需要访问string包含月份名称的对象数组,以便我可以将它们用于显示月份名称而不是月份编号的日期输出.我使用了一个enum数字月份(将用于switch).

const enum MONTH_IDS { JANUARY = 1, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY,
    AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER };

const string MONTH_NAMES[NUM_MONTHS] = { "January", "February", "March",
    "April", "May", "June", "July", "August", "September", "October",
    "November", "December" };
Run Code Online (Sandbox Code Playgroud)

这一部分的问题是,你把它们放在哪里?

我不能做的一些事情...... 我不允许使用静态类成员,因为这将在下一章中介绍.我们还没有超过指针,但我们可以使用引用.

谢谢你的帮助!

我会问教练,但他不在城里,明天就要完成任务.

Rob*_*obᵩ 4

1)定义很难看。static const int成员是我想做的,但你不能......枚举怎么样?

struct Date {
    enum Constants {
        DEFAULT_YEAR = 2001,
        DEFAULT_MONTH = 1,
        DEFAULT_DAY = 1,
    };


    Date(int month = DEFAULT_MONTH, int day = DEFAULT_DAY, int year = DEFAULT_YEAR);

};
Run Code Online (Sandbox Code Playgroud)

2)静态成员数组正是您所需要的。但因为你不能......也许是静态局部变量:

struct Date {
    std::string MonthToString(enum MONTH_IDS m) {
        static const char *monthNames[] = {
            "January", "February", "March", "April", "May", "June",
            "July", "August", "September", "October", "November", "December" };
        if(m >= sizeof(monthNames)/sizeof(monthNames[0]))
            return std::string("Unknown");
        return std::string(monthNames[m]);
    }
};
Run Code Online (Sandbox Code Playgroud)