可以使用函数初始化静态数组吗?

时间:2019-08-12 08:28:25

标签: c++ static

我有一个带有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;
  ...
}

问题是我不知道在哪里定义和使用这样的函数,它应该是成员函数吗?全局功能?我应该何时调用它,使其仅发生一次?

4 个答案:

答案 0 :(得分:0)

使用c样式数组

只需立即对其进行初始化:

// 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 }; 
    }();
};