Тук бих следвал различни подходи в зависимост от това дали имате достъп до 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>
, тогава можете да използвате списък-инициализация
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