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

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

我想要些类似的东西。

class A {

private:

static const string RECTANGLE = "rectangle";

}

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

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

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

错误:将“ RECTANGLE”设为静态

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

任何帮助表示赞赏。

#1楼

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

第一

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

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

干杯

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值