我刚刚发现以下内容无效。
//Header File
class test
{
const static char array[] = { '1', '2', '3' };
};
初始化这个的最佳位置在哪里?
答案 0 :(得分:49)
最佳位置是源文件
// Header file
class test
{
const static char array[];
};
// Source file
const char test::array[] = {'1','2','3'};
您可以像尝试的那样在类声明中初始化整数类型;所有其他类型必须在类声明之外初始化,并且只能初始化一次。
答案 1 :(得分:29)
您可以随时执行以下操作:
class test {
static const char array(int index) {
static const char a[] = {'1','2','3'};
return a[index];
}
};
关于这个范例的一些好消息:
答案 2 :(得分:20)
//Header File
class test
{
const static char array[];
};
// .cpp
const char test::array[] = { '1', '2', '3' };
答案 3 :(得分:6)
现在,在C ++ 17中,您可以使用内联变量
一个简单的静态数据成员(N4424):
struct WithStaticDataMember { // This is a definition, no outofline definition is required. static inline constexpr const char *kFoo = "foo bar"; };
在你的例子中:
//Header File
class test
{
inline constexpr static char array[] = { '1', '2', '3' };
};
应该正常工作
答案 4 :(得分:0)
这是对系统的一种滥用,但是如果您确实要在头文件中定义它(并且您没有C ++ 17),则可以这样做。它不会是一个静态成员,但是它将是一个仅占用每个编译单元(而不是每个类实例)存储的常量:
(将所有这些代码放在头文件中。)
namespace {
const char test_init_array[] = {'1', '2', '3'};
}
class test {
public:
const char * const array;
test() : array(test_init_array) {}
};
答案 5 :(得分:0)
使用constexpr
,即使在C ++ 11中,也必须在标头上定义值
如果您使用constexpr
而不是const
,那么this answer suggests不仅可以而且必须在标头even in C++11上进行定义:
#include <cassert>
struct MyClass {
static constexpr int is[] = {1, 2, 3};
static constexpr int i = 1;
};
// TODO is this ever mandatory? Create example that fails on -std=c++11.
// Pretty sure never mandatory in C++17 https://stackoverflow.com/a/40959093/895245
// constexpr int MyClass::is[];
int main (void) {
assert(MyClass::is[0] == 1);
assert(&MyClass::is[0] == &MyClass::is[1] - 1);
assert(MyClass::i == 1);
assert(&MyClass::i == &MyClass::i);
}
编译并运行:
g++-10 -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main.out main.cpp
./main.out
如果相反,您尝试:
struct MyClass {
static constexpr int is[];
};
constexpr int MyClass::is[] = {1, 2, 3};
编译失败:
main.cpp:4:26: error: ‘constexpr’ static data member ‘is’ must have an initializer
在Ubuntu 20.04上测试。