静态常量字符串(类成员)

问题描述 投票:428回答:11

我想为一个类拥有一个私有的静态常量(在这种情况下,是一个形状工厂)。

我想要一些类似的东西。

class A {
   private:
      static const string RECTANGLE = "rectangle";
}

不幸的是,我从C ++(g ++)编译器中收到各种错误,例如:

ISO C ++禁止初始化成员“ RECTANGLE”

非整数类型“ std :: string”的静态数据成员的无效的类内初始化

错误:将“ RECTANGLE”设为静态)>

这告诉我这种成员设计不符合该标准。您如何在没有使用#define指令的情况下拥有私有的文字常量(或也许是公共的)(我想避免数据全局性的丑陋!)

感谢您的任何帮助。

我想为一个类(在这种情况下为形状工厂)提供一个私有的静态常量。我想要些类似的东西。类A {私有:静态const字符串RECTANGLE =“ rectangle”; ...

c++ string class static const
11个回答
450
投票

您必须在类定义之外定义静态成员,并在其中提供初始化程序。


4
投票

您可以采用上述的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;  
}  

2
投票

快进至2018和C ++ 17。

  • 不要使用std :: string,请使用std :: string_view文字

146
投票

在C ++ 11中,您现在可以做:


33
投票

内部类定义中,您只能declare


17
投票

这只是额外的信息,但是,如果您确实希望将字符串包含在头文件中,请尝试以下操作:


13
投票

在C ++ 17中,您可以使用内联变量


8
投票

使用该类内初始化语法,常量必须为静态整数或枚举类型的const通过常量表达式初始化。


7
投票

class静态变量可以在标头中declared


4
投票

当前标准仅允许对静态常数整数类型进行此类初始化。因此,您需要按照AndreyT的说明进行操作。但是,可以通过new member initialization syntax在下一个标准中使用。


4
投票

可能只是这样做:

static const std::string RECTANGLE() const {
    return "rectangle";
} 
© www.soinside.com 2019 - 2024. All rights reserved.