Здесь я бы придерживался разных подходов в зависимости от того, есть ли у вас доступ к С++ 11 или нет.
В C++03 я бы использовал обычный массив (поскольку он константный) и, вероятно, даже не в классе, а в частном пространстве имен в файле реализации (поскольку оно является закрытым, предполагая, что только одна единица перевода имеет определения для членов 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();
В С++ 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>
, вы можете использовать list-initialization
const std::vector<int> ImageModel::mZoomLevels{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
person
David Rodríguez - dribeas
schedule
07.12.2012
const std::vector<int> ImageModel::mZoomLevels(...)
? - person Ben Voigt   schedule 07.12.2012