包含std :: string

时间:2017-06-12 09:43:47

标签: c++ string static const constants

所以我目前正在使用C ++开展一个学校项目,我对此并不熟悉。 我想创建一个包含所有常量的类(string,int,double,own classes) 我正在尝试这个,这在Java中一直对我有用:

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   

那么有什么方法可以存储像这样的String-Constants吗? 如果是的话,还有更好的方法吗?如果不是,还有另一种方式(#define?)?

2 个答案:

答案 0 :(得分:4)

在C ++ 17中,推荐使用inline constexpr std::string_view定义字符串常量的方法。例如:

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

这很棒,因为:

  • std::string_view是一个轻量级的非拥有包装器,可以有效地引用字符串文字而无需任何额外费用。

  • std::string_viewstd::string无缝互操作。

  • 将变量定义为inline可防止出现ODR问题。

  • 将变量定义为constexpr使编译器和其他开发人员都清楚这些是编译时已知的常量。

如果你没有使用C ++ 17,那么这里是一个C ++ 11解决方案:在命名空间中将常量定义为constexpr const char*

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

答案 1 :(得分:1)

您应该在头文件中声明您的数据成员,但 definitions 应该放在源文件中,例如:

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

详细了解:Static Data Member Initialization

PS:类不用于向公共范围公开其数据成员。而是使用Getter和Setter函数,而数据成员不在公共范围内。如果您只需要数据成员,那么命名空间可能是比类更好的设计选择。