如何在C++中为私有静态成员编写init/cleanup代码?

Pau*_*ter 2 c++ initialization

使用简单的值,没有问题:我们只需在.cpp文件中设置它们.

但请考虑以下示例,它需要一些init/cleanup代码:

// .h
class MyClass {
...
private:
    static unsigned First1000Primes[1000];
} ;
Run Code Online (Sandbox Code Playgroud)

在.cpp文件中,我们要初始化数组,并需要一些代码.

我们可以在.cpp文件中定义一个类Initializer,使用一个填充值的ctor,并在同一个文件中声明一个静态的Initializer InitAndCleanup,这样代码将在启动时运行一次(如果需要,同样运行dtor/cleanup代码) .

这个解决方案的问题在于它的"混乱",因为初始化程序必须是MyClass的朋友才能访问其私有部分.

所以我的问题是:有更干净的方式吗?

Pup*_*ppy 5

std::array改用.

class MyClass {
...
private:
    static std::array<unsigned, 1000> First1000Primes;
} ;
Run Code Online (Sandbox Code Playgroud)

现在初始化的问题是一个简单的lambda

std::array<unsigned, 1000> MyClass::First1000Primes = [&] {
    std::array<unsigned, 1000> primes;
    // fill primes
    return primes;
}();
Run Code Online (Sandbox Code Playgroud)

  • 不.这是一个lambda函数,我在定义后立即执行.Lambda是最大的C++ 11特性之一 - 具有可变参数模板和右值引用. (2认同)

Luc*_*ore 5

您可以使用初始化静态的常规方法:

unsigned MyClass::First1000Primes[] = {2,3, /*...*/};
Run Code Online (Sandbox Code Playgroud)

在实现文件中.我建议你std::vector改用吗?