我想为一个类拥有一个私有的静态常量(在这种情况下,是一个形状工厂)。
我想要一些类似的东西。
class A {
private:
static const string RECTANGLE = "rectangle";
}
不幸的是,我从C ++(g ++)编译器中收到各种错误,例如:
ISO C ++禁止初始化成员“ RECTANGLE”
非整数类型“ std :: string”的静态数据成员的无效的类内初始化
错误:将“ RECTANGLE”设为静态)>
这告诉我这种成员设计不符合该标准。您如何在没有使用#define指令的情况下拥有私有的文字常量(或也许是公共的)(我想避免数据全局性的丑陋!)
感谢您的任何帮助。
我想为一个类(在这种情况下为形状工厂)提供一个私有的静态常量。我想要些类似的东西。类A {私有:静态const字符串RECTANGLE =“ rectangle”; ...
您必须在类定义之外定义静态成员,并在其中提供初始化程序。
您可以采用上述的const char*
解决方案,但是如果您一直都需要使用字符串,那么将会有很多开销。另一方面,静态字符串需要动态初始化,因此,如果要在另一个全局/静态变量的初始化期间使用它的值,则可能会遇到初始化顺序的问题。为避免这种情况,最便宜的方法是通过getter访问静态字符串对象,该方法检查对象是否已初始化。
//in a header
class A{
static string s;
public:
static string getS();
};
//in implementation
string A::s;
namespace{
bool init_A_s(){
A::s = string("foo");
return true;
}
bool A_s_initialized = init_A_s();
}
string A::getS(){
if (!A_s_initialized)
A_s_initialized = init_A_s();
return s;
}
快进至2018和C ++ 17。
在C ++ 11中,您现在可以做:
内部类定义中,您只能declare
这只是额外的信息,但是,如果您确实希望将字符串包含在头文件中,请尝试以下操作:
在C ++ 17中,您可以使用内联变量
使用该类内初始化语法,常量必须为静态整数或枚举类型的const通过常量表达式初始化。
class静态变量可以在标头中declared
当前标准仅允许对静态常数整数类型进行此类初始化。因此,您需要按照AndreyT的说明进行操作。但是,可以通过new member initialization syntax在下一个标准中使用。
可能只是这样做:
static const std::string RECTANGLE() const {
return "rectangle";
}