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

Posted

技术标签:

【中文标题】如何通过头文件中的函数初始化 const int 数组?【英文标题】:How to initialize a const int array by a function in a header file? 【发布时间】:2017-07-30 22:18:47 【问题描述】:

我可以像这样在头文件中轻松声明和初始化一个常量数组成员:

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' typeerror,因为数组应该已经被初始化了。

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

【问题讨论】:

函数在哪里? 在这样的函数之外的类定义中不能有循环。 @uzumaki This is what I mean. @uzumaki -- 此部分适用于 cmets,StoryTeller 发表了评论。 如果你对试图让你头疼的人无礼,你应该维护这样的代码。 【参考方案1】:

可以使用BOOST_PP_REPEAT,如果您的数组最多可以包含 256 个元素(如果您坚持使用 MSVC,则更少)。比如:

#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 的成员变量,因为这几乎从来都不是有用的事情,并且有很大的限制关于您的程序可以做什么(例如,它删除了赋值运算符)。

【讨论】:

【参考方案2】:

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

#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;

【讨论】:

以上是关于如何通过头文件中的函数初始化 const int 数组?的主要内容,如果未能解决你的问题,请参考以下文章

声明和定义,const,enum,头文件

是否可以将实际参数定义为`const int`,但在头文件中将其声明为`int`?

如何在C语言中执行shell命令

在仅拿到头文件的情况下,如何修改类中的私有成员值?

初始化数据表sequence(const int&,const int&,float)括号里什么意思?

C++ const int 在常量表达式中不可用