仅初始化只读数组一次

时间:2015-03-02 19:10:27

标签: c++

我有一个类需要使用一些大数组,通过一些复杂的函数进行初始化,对于每个实例都是相同的,并且只能在初始化后读取。

我在搜索SO时发现了一些关于初始化静态数组的答案:

char A::a[6] = {1,2,3,4,5,6};

但在我的情况下,我需要通过一些函数在运行时计算数组。 (怎么样)我能做到吗?

4 个答案:

答案 0 :(得分:2)

RE

  

对于每个实例都是相同的,只会在初始化后读取

生成值是函数的作用。

只需定义一个返回所需数据的函数。

您可以使用它来初始化静态数据成员(或其他)。对于仅标题模块,如果相关,则需要采用“内联数据”问题的解决方案,例如:迈耶斯的单例(一个返回对局部静态变量的引用的函数)。像这样:

#include <vector>

namespace my {
    using std::vector;

    inline
    auto squares()
        -> vector<int>
    {
        vector<int> result;
        for( int i = 1; i <= 12; ++i ) { result.push_back( i*i ); }
        return result;
    }

    class A
    {
    private:
        static
        auto a()
            -> const vector<int>&
        {
            static const vector<int> the_values = squares();
            return the_values;
        }

    public:
        A(){}
    };
}  // namespace my

答案 1 :(得分:1)

您无法在执行时使用{}语法,您可以使用以下方法:

class A
{
   static vector<char> a;
   //...
   public:
   static void initStatic();
}

void A::initStatic()
{
    a.resize( /*put the size here... */);
    for (auto& x : a)
        x = //something...
}

矢量参考:http://en.cppreference.com/w/cpp/container/vector

答案 2 :(得分:0)

如果您没有使用矢量,这可行。我让A::initialize完成工作的原因是,我们可以而且应该期望数据成员a是私有的,而不是仅仅调用其中一个外部定义的函数。

//Declare a function pointer type, so you can pass it into A's
//an initialization function takes in the array and its size
typedef void (*initFunction) (char A[], int arraySize); 
//see http://www.cprogramming.com/tutorial/function-pointers.html
//  for more on function pointers

class A
{
public:
  void initialize (initFunction myInitFunction);
  ...
private:
  char a[ARRAYSIZE];
};

void A::initialize (initFunction myInitFunction)
{
   (*myInitFunction) (a, ARRAYSIZE);  
}

...
A myA;
myA.initialize (yourArrayInitializingFunction);

或许您的初始化函数不会接受数组并初始化它们,但返回数组:

class A
{
public:
  void initialize (const char* aInit);
  ...
};

void A::initialize (const char* aInit)
{
   for (int i = 0; i < ARRAYSIZE: ++i)
     a[i] = aInit[i];
}

...

A myA;
myA.initialize (yourArrayReturningFunction ());

如果您正在使用向量,则代码更简单:

class A
{
public:
  void initialize (const vector<char>& aInit) { a = aInit; }
  ...
private:
  vector<char> a;
};

答案 3 :(得分:-1)

我的建议:

  1. 使用静态成员函数来提供对数组的访问,而不是使用静态成员变量。

  2. 在静态成员函数中,创建一个静态函数变量,可以在第一次需要时填充。

  3. 这就是我的想法:

    char* A::getArray()
    {
       static char a[6] = {0};
       static bool inited = false;
       if ( !inited )
       {
          // Initialize the array elements 
          a[0] = ...  ;
    
          ...
    
          a[5] = ...  ;
    
          inited = true;
       }
    
       return a;
    }