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

我想要一个类的私有静态常量(在这种状况下是形状工厂)。 函数

我想要些相似的东西。 this

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

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

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

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

错误:将“ RECTANGLE”设为静态 内存

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

任何帮助表示赞扬。 get


#1楼

您必须在类定义以外定义静态成员,而后在其中提供初始化程序。 编译器

第一 string

// In a header file (if it is in a header file in your case)
class A {   
private:      
  static const string RECTANGLE;
};

而后

// In one of the implementation files
const string A::RECTANGLE = "rectangle";

您最初尝试使用的语法(类定义内的初始化程序)仅适用于整数和枚举类型。


从C ++ 17开始,您还有另外一个选择,与原始声明很是类似:内联变量

// In a header file (if it is in a header file in your case)
class A {   
private:      
  inline static const string RECTANGLE = "rectangle";
};

无需其余定义。

或者,您能够在此变体中将其声明为constexpr而不是const 。 显式inline将再也不是必需的,由于constexpr暗示了inline


#2楼

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

这是限制。 所以,在这种状况下,您须要在类外部定义变量。 引用@AndreyT的答案


#3楼

这只是额外的信息,可是若是您确实但愿将字符串包含在头文件中,请尝试如下操做:

class foo
{
public:
    static const std::string& RECTANGLE(void)
    {
        static const std::string str = "rectangle";

        return str;
    }
};

虽然我怀疑这是值得推荐的。


#4楼

当前标准仅容许对静态常数积分类型进行此类初始化。 所以,您须要按照AndreyT的说明进行操做。 可是,将经过新的成员初始化语法在下一个标准中提供该功能


#5楼

在类定义内部,您只能声明静态成员。 它们必须在类以外定义 。 对于编译时积分常量,该标准例外,您能够“初始化”成员。 可是,这仍然不是一个定义。 例如,没有定义就没法使用该地址。

我想说起的是,我没有看到使用std :: string而不是const char [] 做为常量的好处。 std :: string很不错,除了它之外,它都须要动态初始化。 因此,若是你写相似

const std::string foo = "hello";

在名称空间范围内,foo的构造函数将在执行main开始以前当即运行,而且此构造函数将在堆内存中建立常量“ hello”的副本。 除非您真的须要RECTANGLE成为std :: string,不然您也能够编写

// class definition with incomplete static member could be in a header file
class A {
    static const char RECTANGLE[];
};

// this needs to be placed in a single translation unit only
const char A::RECTANGLE[] = "rectangle";

那里! 没有堆分配,没有复制,没有动态初始化。

干杯

相关文章
相关标签/搜索