2010-07-21 74 views
1

如果你有一個類,有一些命名常量,什麼是最好的實踐的研究,用於存儲常數:在哪裏存儲類的具體命名常量在C++

選項1:命名空間中的類頭

所以在我的類的頭,我將有:

class myClass 
{ 
... 
... 
}; 

namespace NamedConstants 
{ 
    const string Bucket = "Bucket"; 
} 

選項2成員常數

class MyClass {  // this goes in the class 
private:       // header file 
    static const string Bucket; 
    ... 
}; 

...並在類實現文件:

const string MyClass::Bucket = "Bucket"; 

其實我更喜歡選項1,考慮到它是清潔劑:將變量名和值一起出現。另外,如果你給的命名空間的好名字,那麼它可以使代碼更易讀當您使用常量:

TrafficLight::Green 

是否有人看到任何問題,用這種方法在選擇2?

+0

字符串值類是特定的還是全局的? – DumbCoder 2010-07-21 13:38:22

+0

@DumbCoder在我的例子中它們是特定於類 – 2010-07-21 13:40:18

+1

可能的重複[在C++中放置常量字符串:靜態類成員或匿名命名空間](http://stackoverflow.com/questions/2465546/where-to-put -constant-strings-in -c-static-class-members-or-anonymous-namespace) – 2010-07-21 13:41:15

回答

3

如果字符串是爲了讓班級的用戶看到/使用,您不會考慮讓他們成爲private班級成員。所以我得出結論,他們不打算被這個班級的用戶看到/使用。但是把它們放入標題根本沒有意義。

如果你把它們放到類(或爲命名空間範圍到頭),那麼其類型和使用標識的所有更改會強制客戶端重新編譯他們的代碼。

如果你把它們到類的實現文件,他們是類的私有細節的實施及其變化不僅迫使類的實現的重新編譯。
如果你把它們放到一個具名命名空間,他們不能與任何其他名字衝突:

namespace { 
    namespace NamedConstants 
    { 
    const string Bucket = "Bucket"; 
    } 
} 
+0

未命名的名稱空間是否使其「更全局」(對於更好的單詞而言) – 2010-07-21 13:51:19

+1

它使該實現文件是私有的。 – 2010-07-21 13:59:59

+1

@David:只是所以我們不會誤解 - 未命名的名稱空間將在類__implementation__文件中,而不在其標頭中。 – sbi 2010-07-21 14:03:04

1

選項1可能會導致每一個文件,其中包括頭一個單獨的字符串對象。所以這取決於你的資源稀缺程度。

+0

但是,如果我把CPP文件,我不會有這個問題對嗎? – 2010-07-21 13:49:02

+1

@David Relihan – 2010-07-21 13:57:03