3 回答
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";
};
无需额外定义。
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。
- 3 回答
- 0 关注
- 710 浏览
添加回答
举报