猿问
下载APP

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

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


我想要有类似的东西。


class A {

   private:

      static const string RECTANGLE = "rectangle";

}

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


ISO C ++禁止成员'RECTANGLE'的初始化


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


错误:使'RECTANGLE'静止


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


任何帮助表示赞赏。


潇潇雨雨
浏览 49回答 3
3回答

繁星coding

您必须在类定义之外定义静态成员并在那里提供初始化程序。第一// 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 filesconst 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";};无需额外定义。

阿波罗的战车

在C ++ 11中,您现在可以做到:class A { private:  static constexpr const char* STRING = "some useful string constant";};

素胚勾勒不出你

在类定义中,您只能声明静态成员。它们必须在课堂之外定义。对于编译时积分常量,标准会使您可以“初始化”成员。但它仍然不是一个定义。例如,如果没有定义,那么获取地址是行不通的。我想提一提,我没有看到使用的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 fileclass A {    static const char RECTANGLE[];};// this needs to be placed in a single translation unit onlyconst char A::RECTANGLE[] = "rectangle";那里!没有堆分配,没有复制,没有动态初始化。干杯,s。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答