根据您是否可以访问 C++11,我将在此处采用不同的方法。
在 C++03 中,我会使用一个普通数组(因为它是 const),甚至可能不在类中,而是在实现文件中的私有命名空间中(因为它是私有的,假设只有一个翻译单元具有的成员的定义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++11 中我会std::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>
then 您可以使用list-initialization
const std::vector<int> ImageModel::mZoomLevels{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };