我有一个带有const静态 C数组的类
// Header file
class test
{
const static char array[];
};
我正在尝试在代码中的某处初始化它,而不是像
这样的简单方法// Source file
const char test::array[] = {'1','2','3'};
因为这些值是使用其他一些常数值计算得出的,所以我需要使用一个函数来做到这一点。 像
CONST_VALUE = 4;
void func(int a[3]){
a[0]=2*CONST_VALUE;
a[1]=10*CONST_VALUE;
...
}
问题是我不知道在哪里定义和使用这样的函数,它应该是成员函数吗?全局功能?我应该何时调用它,使其仅发生一次?
答案 0 :(得分:0)
只需立即对其进行初始化:
// Header file
class test
{
static inline const char array[]{2 * CONST_VALUE, 10 * CONST_VALUE};
};
std::array
// Header file
class test
{
static inline const std::array<2, char>{2 * CONST_VALUE, 10 * CONST_VALUE};
};
std::vector
向量只是比使用数组更简单的解决方案:
// Header file
class test
{
static inline const std::vector<char> array{2 * CONST_VALUE, 10 * CONST_VALUE};
};
答案 1 :(得分:0)
如果要使用动态分配,它可能看起来像这样:
class test
{
const static char* array;
};
char* foo(int arr_size) {
char* arr = new char[arr_size]();
// other logic
return arr;
}
const char* test::array = foo(10);
除非您要将模块用作在运行时加载和卸载的共享库,否则实际上并不需要删除此内存。
对于固定大小的数组,我认为您应该使用std::array
:
#define ARR_SIZE 4
class test2
{
const static std::array<char, ARR_SIZE> array;
};
std::array<char, ARR_SIZE> foo2() {
std::array<char, ARR_SIZE> arr;
arr[0] = 'x';
// other logic
return arr;
}
const std::array<char, ARR_SIZE> test2::array = foo2();
最后,如果必须处理C样式的数组,则可以尝试使用具有分别计算每个元素的函数的技巧:
class test3
{
const static char array[ARR_SIZE];
};
char calculateElement(int index) {
if (index == 0) {
return 'x';
} else if (index == 1) {
return 'y';
}
// rest of the logic
return 0;
}
const char test3::array[ARR_SIZE] = {
calculateElement(0),
calculateElement(1),
calculateElement(2),
calculateElement(3) };
答案 2 :(得分:0)
如果所有func()
都进行分配,则可以将这些分配转换为初始值:
const char test::array[] {
2 * CONST_VALUE,
10 * CONST_VALUE
};
但是如果func()
中包含其他逻辑,则可以改用std::array
:
std::array<char, 3> func()
{
std::array<char, 3> ar{};
ar[0]=2*CONST_VALUE;
ar[1]=10*CONST_VALUE;
// ...
return ar;
}
class test {
static const std::array<char, 3> array;
};
const std::array<char, 3> test::array = func();
答案 3 :(得分:0)
如果使用std :: array而不是C样式的数组,则可以使用constexpr lambda对其进行初始化。请参见编译器资源管理器https://godbolt.org/z/izhWcR
class test
{
constexpr static std::array<char, 2> mArray1 = [](){
char v = const_a + const_c;
return std::array<char, 2>{ const_a, v };
}();
};