在C ++中初始化类的静态数组成员的更好方法(虽然const是首选)

时间:2011-11-12 23:21:08

标签: c++ static-initialization static-initializer static-array

我有一个指向函数的静态数组指针作为类的成员。

我需要对它进行初始化,但事实证明这个数组的长度是64K项,所以使用像{ x, y, z, ... }之类的静态初始化器来初始化它是不切实际的,因为它会使代码混乱。

我反而用代码初始化它,有几个循环。

我想要这样做的方法是初始化构造函数中的static数组并为其设置一个标志,因此只有该类的第一个实例的构造才会触发此初始化。

同样从实例中访问此静态标志不是线程安全的,但这是另一个故事。

有更清洁或更好的方法吗?

我也希望这个数组是const,但我担心唯一的方法是使用static {}初始化,对吗?

2 个答案:

答案 0 :(得分:6)

另一种选择是使用代码生成:编写一个单独的程序,生成静态数组定义的源代码。

答案 1 :(得分:1)

也许不是最干净的代码,但如何使成员数组成为静态引用;

头文件:

class MyClass
{
    ...
    static const std::vector<pointer to member>& pointer_vector;
};

实施档案:

namespace
{
    typedef std::vector<pointer to member> t_pointer_vector;

    t_pointer_vector pointer_vector;

    const t_pointer_vector& initialize_pointer_vector(void)
    {
        //generate pointer_vector

        return pointer_vector;
    }
}

t_pointer_vecotor& MyClass::pointer_vector = initialize_pointer_vector();

如果您不想std::vector,可以查看std::tr1::array,一个固定大小的数组,它比C样式数组更安全且效率更低(根据Boost doc)。它是TR1的一部分。有关TR1的基本信息可以在wikipedia上找到,其documentation位于Boost下。