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

How to write init/cleanup code for private static members in C++?

本文关键字:init 代码 cleanup 静态成员 C++      更新时间:2023-10-16

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

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

// .h
class MyClass {
...
private:
    static unsigned First1000Primes[1000];
} ;

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

我们可以在.cpp文件中定义一个类Initializer,并使用一个填充值的ctor,并在同一文件中声明一个静态Initializer InitAndCleanup

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

所以我的问题是:有更清洁的方法吗?

请改用std::array

class MyClass {
...
private:
    static std::array<unsigned, 1000> First1000Primes;
} ;

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

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

您可以使用初始化静态的正常方式:

unsigned MyClass::First1000Primes[] = {2,3, /*...*/};

在实现文件中。我可以建议你用std::vector吗?

我想说,就像其他一切一样,这只是封装和封装的问题。

struct PrimeArray {
    PrimeArray();   // init here
    PrimeArray(PrimeArray const&) = delete;
    PrimeArray& operator=(PrimeArray const&) = delete;
    ~PrimeArray();  // cleanup here
    unsigned data[1000];
};

然后使用

class MyClass {
public:
    // ...
private:
    static PrimeArray const primes;
};

并像往常一样在cpp中初始化:

PrimeArray const MyClass::primes{};