2017-06-12 83 views
0

所以我目前正在使用C++進行學校項目,但我並不十分熟悉。 我想創建一個類,包含我所有的常量(字符串,整數,雙,所在的班級) 我想這一點,它一直在Java中爲我工作:包含std :: string的常量的類

class Reference { 


    //Picture-Paths 
    public: 
    static const std::string deepSeaPath = "E:\\Development\\C++\\Material\\terrain\\deep_sea.tga"; 
    static const std::string shallowWaterPath = "E:\\Development\\C++\\Material\\terrain\\deep_sea.tga"; 
    static const std::string sandPath = "E:\\Development\\C++\\Material\\terrain\\deep_sea.tga"; 
    static const std::string earthPath = "E:\\Development\\C++\\Material\\terrain\\deep_sea.tga"; 
    static const std::string rocksPath = "E:\\Development\\C++\\Material\\terrain\\deep_sea.tga"; 
    static const std::string snowPath = "E:\\Development\\C++\\Material\\terrain\\deep_sea.tga"; 

}; 

在C++中,然而,我得到以下錯誤:

Error C2864 'Reference::Reference::earthPath': a static data member with an in-class initializer must have non-volatile const integral type bio-sim-qt e:\development\c++\bio-sim-qt\bio-sim-qt\Reference.hpp 16 1 

那麼有什麼辦法讓我存儲例如字符串常量這樣嗎? 如果是,是否還有更好的方法來做到這一點?如果不是,是否有另一種方式(#define?)?


+1

如果你在課堂上所有的都是公共靜態成員變量(或公共靜態成員函數),那麼我建議使用一個名稱空間。 –

+1

至於你的問題,只把*聲明*放在類(或名稱空間)中,然後把*定義*(以及它們的初始化)放在一個源文件中。 –

回答

4

在C++ 17中,推薦使用inline constexpr std::string_view來定義字符串常量。例如:

namespace reference 
{ 
    inline constexpr std::string_view deepSeaPath{R"(something)"}; 
    // ... 
} 

這是偉大的,因爲:

  • std::string_view是一個輕量級的非所屬的包裝,可以高效地參考字符串文字沒有任何額外的費用。

  • std::string_view無縫地與std::string互操作。

  • 將變量定義爲inline可防止ODR問題。

  • 將變量定義爲constexpr使編譯器和其他開發人員清楚這些是編譯時已知的常量。


如果你沒有使用C++ 17的奢華,這裏是一個C++ 11的解決方案:

namespace reference 
{ 
    constexpr const char* deepSeaPath{R"(something)"}; 
    // ... 
} 
+0

感謝您提供豐富而快速的回覆。 constexpr中的'R'const char * deepSeaPath {R「(something)」};意思? – Awesome36

+2

這是一個名爲「原始字符串文字」的C++ 11功能。 –

1

你應該:在命名空間中定義的常量爲constexpr const char*聲明您的數據成員在您的頭文件中,但定義應放置在源文件中,例如:

const std::string Reference ::earthPath = "E:\\Development\\C++\\Material\\terrain\\deep_sea.tga"; 

瞭解更多:Static Data Member Initialization


PS:類不使用公開範圍公開作用域的數據成員。取而代之使用Getter和Setter函數,而數據成員不在公共範圍內。如果你需要的只是你的數據成員,那麼命名空間可能是一個更好的設計選擇,而不是一個類。

相關問題