所以我目前正在使用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?)?
答案 0 :(得分: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解决方案:在命名空间中将常量定义为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函数,而数据成员不在公共范围内。如果您只需要数据成员,那么命名空间可能是比类更好的设计选择。