2

単純な値の場合、問題はありません。.cppファイルに設定するだけです。

ただし、次の例を考えてみましょう。これには、初期化/クリーンアップコードが必要です。

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

.cppファイルでは、配列を初期化する必要があり、そのためのコードが必要です。

.cppファイルでクラスInitializerを定義し、値を入力するctorを使用して、同じファイルで静的Initializer InitAndCleanupを宣言できるため、コードは起動時に1回実行されます(必要に応じて同様にdtor / cleanupコードを実行します)。 。

このソリューションの問題は、初期化子がそのプライベートパーツにアクセスするためにMyClassのフレンドである必要があるため、その「乱雑さ」です。

だから私の質問は:よりクリーンな方法はありますか?

4

3 に答える 3

5

std::array代わりに使用してください。

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

ここで、初期化の問題は単純なラムダです

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, /*...*/};

実装ファイル内。std::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 に答える