为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
潇潇雨雨 2019-09-18 19:30:36
我想为一个类(在这种情况下是一个形状工厂)有一个私有静态常量。我想要有类似的东西。class A {   private:      static const string RECTANGLE = "rectangle";}不幸的是,我从C ++(g ++)编译器中得到了各种错误,例如:ISO C ++禁止成员'RECTANGLE'的初始化非整数类型'std :: string'的静态数据成员的无效类初始化错误:使'RECTANGLE'静止这告诉我这种成员设计不符合标准。如何在不使用#define指令的情况下拥有私有文字常量(或者可能是公共的)(我想避免数据全局性的丑陋!)任何帮助表示赞赏。
查看完整描述

3 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

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


第一


// 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";

};

无需额外定义。


查看完整回答
反对 回复 2019-09-18
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

在类定义中,您只能声明静态成员。它们必须在课堂之外定义。对于编译时积分常量,标准会使您可以“初始化”成员。但它仍然不是一个定义。例如,如果没有定义,那么获取地址是行不通的。


我想提一提,我没有看到使用的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";

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


干杯,s。


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 710 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信