簡體   English   中英

我應該在哪里放置班級需要的常量,以保持全局空間的自由?

[英]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::foousing 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM