2017-07-30 98 views
-3

我可以很容易地声明并在头文件中,像这样初始化一个恒定阵列成员:如何通过头文件中的函数初始化const int数组?

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

哪里的功能是什么? – juanchopanza

+0

@juanchopanza这个例子中的函数是pow。 – uzumaki

+0

如果预先知道这些值,则可以计算它们,并在代码中只写出结果。也许增加一些评论来解释价值。 – Dialecticus

回答

4

如果您的数组最多可以包含256个元素(如果您坚持使用MSVC,则可能会更少),则可以使用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")}; 

但你应该真的,真的,问自己,为什么你需要一个非staticconst成员变量,因为这是几乎从来没有做一个有用的东西,并且对什么专业限制你的程序可以做(例如删除赋值操作符)。

+0

单独的最后一段值得投票。 – StoryTeller

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; 
} 
相关问题