2

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

但请考虑以下示例,它需要一些初始化/清理代码:

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

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

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

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

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

4

3 回答 3

5

改用 a 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;
}();
于 2012-07-15T13:27:54.930 回答
5

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

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

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

于 2012-07-15T13:27:56.657 回答
1

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

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{};
于 2012-07-15T14:26:26.507 回答