[英]Where do I place constants needed by my class in order to keep global space free?
第一:我知道如何編寫程序,因此我不尋求幫助。 但是,我正在粘貼問題的副本,以便您可以看到分配的含義。 我的問題專門針對您在哪里放置變量以防止使所有內容全局化?
分配
設計一個名為Date的類,該類具有整數數據成員以存儲月,日和年。 該類應具有一個三參數的默認構造函數,該構造函數允許在創建新的Date對象時設置日期。 如果用戶創建的Date對象沒有傳遞任何參數,或者傳遞的任何值無效,則應使用默認值1、1、2001(即2001年1月1日)。 該類應具有成員函數以下列格式打印日期:
3/15/10
March 15, 2010
15 March 2010
問題
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);
它是否正確?
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" };
這部分的問題是,您將它們放在哪里?
有些事情我做不到...目前還不允許使用靜態類成員,因為下一章將對此進行介紹。 我們也沒有遍歷指針,但是我們可以使用引用。
謝謝你的幫助!
我想請教官,但他不在城里,所以作業明天就要交。
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);
};
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]);
}
};
如果您想定義一個常量而不污染全局名稱空間,那么您最好的兩個選擇是使用名稱空間的全局變量或類靜態變量。 既然您說不能使用類靜態變量,我將展示一個命名空間全局變量的示例:
// .h file
namespace mynamespace {
extern const int foo;
};
// later, in a .cpp file
namespace mynamespace {
const int foo = 42;
};
您可以使用mynamespace::foo
或using namespace mynamespace;
來訪問此變量using namespace mynamespace;
(應避免在頭文件中),或者在mynamespace
命名空間中的任何其他函數中僅作為foo
。 由於只能由請求(或以其他方式知道) mynamespace
名稱空間的人訪問它,因此避免了污染全局名稱空間(以及所有涉及此的不幸的名稱沖突)。
對於數值, enum
是另一種選擇:
class foo {
enum { CONST_FOO = 42, CONST_BAR = 24 };
};
這些值是編譯時常量。 您不能使用它們的地址(但是它們可以比const
變量快一點)。 請注意,這只能用於整數值。
函數靜態是另一個不錯的選擇:
void myclass::somefunction() {
static const char *monthNames[] = { "JANUARY", ... };
//...
}
但是,由於數組已深深地嵌入到您的實現中,因此它並不比“幻數”好多少。
在您的情況下,我確實認為最好使用enum
或(對於非整數)類靜態變量是最好的。 如果您的教授任意限制使用類靜態變量,請將變量放在全局范圍內(可能在名稱空間中),並添加一條注釋,說明如果允許的話,您將使它們成為類靜態變量。
如果您不能執行static const
成員(或本地成員),則可以將所有內容放入命名空間中:
宣言:
namespace ephaitch {
extern const int Date_default_month;
extern const int Date_default_day;
extern const int Date_default_year;
class Date {
Date(int month = DEFAULT_MONTH, int day = DEFAULT_DAY, int year = DEFAULT_YEAR);
};
}
定義:
namespace ephaitch {
const int Date_default_month = 1;
const int Date_default_day = 1;
const int Date_default_year = 2001;
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"
};
Date(int month, int day, int year)
{
}
}
不要使用DEFINE
,它們會污染所有名稱空間,並使調試更加棘手。 enum
是更好的方法,但是由於這不是預期的用法,因此可能會造成混淆。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.