如何通过头文件中的函数初始化const int数组?

时间:2017-07-30 22:18:47

标签: c++ arrays macros initialization preprocessor

我可以很容易地在头文件中声明和初始化一个常量数组成员,如下所示:

class MyClass {
 public:
  const int arr[4] = {1, 2, 3, 4};
}

但是当数据由函数定义时,我无法在标题中初始化它:

#include <cmath>
#define BASE 2
class MyClass {
 public:
  const int arr[4];
  for (i=0;i<4;i++) {
        arr[i] = pow(BASE, i);
  }
}

当我尝试在.cpp文件的类构造函数中初始化数组时,我得到明显的uninitialized member with 'const' type错误,因为数组应该已经初始化。

如何使用预处理器宏和cmath函数初始化头文件中的const int数组?

2 个答案:

答案 0 :(得分:4)

如果您的阵列最多可以包含256个元素(如果您遇到MSVC则更少),则可以使用CREATE TABLE.. AS。类似的东西:

BOOST_PP_REPEAT

但你应该真的,真的,问问自己为什么你需要一个非#define my_elem(z, n, data) pow(BASE, n) const int data[4] = {BOOST_PP_REPEAT(4, my_elem, "ignored - extra data not needed")}; static成员变量,因为这几乎不是一件有用的事情,并且对程序可以执行的操作设置了主要限制(例如,它删除了赋值运算符)。

答案 1 :(得分:0)

你可以这样做(如果数组不是太长):

#include <iostream>
#include <cmath>
#include <functional>

constexpr int BASE = 2;

class A {
public:

    A(std::function<int(int)> f);

    const int arr[4];
};

A::A(std::function<int(int)> f) :
    arr{ f(1),f(2), f(3), f(4) }
{
}

int main() {
    auto f = [](int i) { return pow(BASE, i); };
    A a(f);
    for (const auto val : a.arr) {
        std::cout << val << std::endl;
    }
    return 0;
}