ここでは、C ++ 11にアクセスできるかどうかに応じて、さまざまなアプローチに従います。
C ++ 03では、プレーン配列(constであるため)を使用しますが、おそらくクラスではなく、実装ファイルのプライベート名前空間で使用します(プライベートであるため、1つの変換ユニットのみがのメンバーの定義ImageModel
。
// cpp
namespace {
static int gZoomLevels[] = { 1, 2, ... };
}
std::vector<int>
このアプローチを本当に使い続けたい場合はstd::vector
、静的な期間で別の変数を作成せずに、メンバーを定義するヘルパー関数を翻訳ユニットに作成し、それを使用してを作成します。
namespace {
static std::vector<int> chooseANameForInitializer() {
int data[] = { 1, 2, 3 };
return std::vector<int>( data, data + (sizeof data/sizeof *data) );
}
}
const std::vector<int> ImageModel::mZoomLevels = chooseANameForInitializer();
C ++ 11std::array<int,...>
では、代わりに使用します。これにより、動的割り当てと余分な間接参照のコストが回避されます。確かにそれは大きな利益ではありstd::vector<int>
ませんが、それが提供する機能のいずれも必要としないときに持っている意味はありません。
class ImageModel
{
private:
static const std::array<int,10> mZoomLevels;
};
// cpp:
const std::array<int,10> ImageModel::mZoomLevels = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
繰り返しますが、あなたが持っていることを主張するなら、あなたはリスト初期化std::vector<int>
を使うことができます
const std::vector<int> ImageModel::mZoomLevels{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };