簡體   English   中英

僅初始化一次只讀數組

[英]Initialize read only array only once

我有一個需要使用一些大型數組的類,這些數組是通過一些復雜的函數初始化的,每個實例都相同,並且只有在初始化后才能讀取。

我在SO上進行搜索,找到了一些初始化靜態數組的答案,如下所示:

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

但就我而言,我需要在運行時通過某些函數計算數組。 (我該怎么做?

回覆

對於每個實例都是相同的,並且只有在初始化后才能讀取

產生值是功能的工作。

只需定義一個返回所需數據的函數即可。

您可以使用它來初始化靜態數據成員(或其他)。 對於僅標題的模塊,如果相關的話,您將需要采用解決“內聯數據”問題的解決方案,例如Meyers的單例(返回對局部靜態變量的引用的函數)。 像這樣:

#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

您不能在執行時使用{} sintaxis,可以使用以下方法:

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

如果您不使用向量,則可以使用。 我之所以讓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;
};

我的建議:

  1. 代替使用靜態成員變量,可以使用靜態成員函數來提供對數組的訪問。

  2. 在靜態成員函數中,創建一個靜態函數變量,該變量可以在第一次需要時填充。

這就是我的想法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM