簡體   English   中英

在哪里定義 C++ 中的類常量?

[英]Where to define class constants in C++?

在 C++ 中,為了獲得更整潔的代碼,我想在頭文件中將一組值聲明為常量,例如:

constexpr float SIZE_SMALL = 1.5f; 
constexpr float SIZE_MEDIUM = 2.5f; 
constexpr std::string COLOR_RED = "RED"; 
constexpr std::string MATERIAL_SILK = "SILK";
...etc

但這變得太長和笨拙了。 此外,一些常量可以組合在一起,因為它們描述了相同屬性的不同值,例如SIZE_SMALLSIZE_MEDIUM

在我的頭文件中寫這個的最好方法是什么? 我想到了結構,例如

struct SIZE
{
float SMALL; 
float MEDIUM; 
}

但隨后我必須在我的 .cpp 中聲明和定義一個變量,這有點超出了所有這些的目的。

然后我必須在我的 .cpp 中聲明和定義一個變量,這有點超出了所有這些的目的。

不,你沒有。 您可以使字段staticconstexpr

struct SIZES {
    static constexpr const float SMALL = 1.5f;
};

但是,我建議不要這樣做。 不僅您不必創建此類的實例,而且您也不應該創建此類的實例(為什么?)。 那么為什么首先要使用一個類呢? 使用namespace s 來對常量進行分組:

namespace SIZES {
    constexpr float SMALL = 1.5f; 
}

我在同一個命名空間中有大約 50 個以上的這些常量

除非你找到一種方法讓編譯器讀懂你的想法,否則你必須把它們都寫在某個地方。 嚴重的是,這可以被壓縮的唯一方法是這些常量之間是否存在某種關系,例如SMALL + 1.0f = MEDIUM ,但這從您的問題中並不明顯。

這取決於您的實際使用情況,但請考慮使用適當的強類型而不是基本類型。 例如,要聲明大小,請將它們設為size類型,而不是float 這並不能直接解決您的分組問題,但它為您提供了強類型的所有其他好處,並且還可能有助於分組:

struct size {
private: float value;
public:
    explicit constexpr size(float value) : value{value} {}
    explicit constexpr operator float() const noexcept { return value; }
};

namespace default_sizes {
    constexpr auto SMALL = size{1.5f};
    constexpr auto MEDIUM = size{2.5f};
    // …
}

事實上,對於特定領域的使用,除了在非常有限的情況下,我通常會避免裸露的基本類型,並始終將它們封裝在自己的特定領域類型中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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