我可以很容易地在头文件中声明和初始化一个常量数组成员,如下所示:
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
数组?
答案 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;
}