Как инициализировать член статического векторного массива в C ++

0
class Foo{
static vector<Point> vec[3];
};

Поэтому у меня есть массив из трех векторов. Мне нужно, чтобы каждый вектор был инициализирован во время компиляции.

Например, что-то похожее на это:

vec[0] = { {1,2}, {3,4}}; // contain two points
vec[1] = { {0, 0}};       // contain one point
vec[2] = {};              // empty

Можно ли сделать это?

Теги:

4 ответа

1

вам нужно объявить его в файле cpp с помощью списка инсталляции

в файле cpp:

vector<Poiint> Foo::vec={Point(1,2,3), Point(4,5,6), Point(8,9,10)};

где Point (x, y, z) является конструктором, поэтому он заполняет вектор тремя элементами

в классе вы должны объявить это следующим образом:

static vector<Point> vec;
  • 1
    Спасибо за подсказки, но я хотел иметь три вектора (в виде массива), а не один :)
0
    vec[0] = { {1,2}, {3,4}};

Это не будет работать, поскольку нет конструктора векторов, который принимает переменное количество объектов (работает в С++ 11 с поддержкой initializer_list).

Чтобы обойти это, вы можете сделать это, используя пару массивов:

    Point v1[2] = {Point(1,2), Point(3,4)};
    Point v2[1] = {Point(0.0)}; 

vector<Point> Foo::vec[] = {vector<Point>(v1, v1+2), vector<Point>(v2, v2+1), vector<Point>()};

Это использует векторный конструктор, который принимает итераторы begin и end для построения вектора.

В С++ 11, я думаю, вы можете сделать это следующим образом:

    vector<Point> Foo::vec[] = {{Point(1,2), Point(3,4)}, {Point(0,0)}, {}};
0

Обходной задачей будет добавление внутреннего статического класса _init (назовите его так, как вам нравится), конструктор которого выполняет фактическую инициализацию.

Class Foo{
public:
static int bar;
static class _init{
 public _init(){// do something to bar}
} Initializer;
};

// --- in .cpp
// define 'bar' and 'Initializer'

Так что конструктор инициализатора будет вызван для инициализации бара.

0

Похоже, что намерение больше похоже на:

static vector < vector<Point> > vec;


Если это так, то с некоторым коротким тестированием в С++ 11, 64-битной С++ Builder для Windows и компиляцией, которая получает желаемый результат. В качестве дополнительного эксперимента после определения конструкторов с параметром-меньше и переданного значения для типа Point (class?), Используемого в этом примере, также вызывает вызов push_back на многомерном vec:

vec.push_back( {{1,2}, {3,4}} );
vec.push_back( {{0,0}} );
vec.push_back( {{4,5}} );

Я уверен, что причиной того, что классом Point можно пренебречь, является то, что многомерный вектор vec был объявлен для хранения экземпляров Point. Последняя строка в OP выше, передающая пустую Точку, ничего не достигает, что может быть показано при перемещении vec. Третий элемент (индекс два) не будет печатать вещь. Точка {4, 5} добавлена для проверки прохождения ко всем индексам vec. Обратите внимание, что внутри вызова push_back есть два набора фигурных скобок. Без внешнего набора фигурных скобок ошибка компилятора говорит: "Нет соответствующей функции-члена для вызова push_back".

Пример кода для перемещения многомерного вектора (например, матрицы или массива):

//
// Declared a typedef to separate the vector row and the whole matrix
// Makes it simpler to traverse each vector row later.  intVals is a 
// test class with public integer elements "a" and "b".  The intVals
// class substitutes for the Point type in the OP above.
//
typedef vector<intVals> vec_t;
vector<vec_t> matrix;


int jj;
for (int i = 0; i < 3; i++)
{  
   jj = 0;
   for (vec_t::iterator j = matrix[i].begin(); j != matrix[i].end(); j++)
   {
      cout << "Matrix at index: " << i << ", element: " << jj << " a = " << (*j).a;
      cout << " b = " << (*j).b << endl;
      jj++;
   }
}                                                  


Обратите внимание, что внешний цикл зажимается в три раза. Реальная реализация могла бы использовать вместо этого matrix: iterator (или диапазон для).

Дополнительную ссылку на многомерный вектор см. В многомерном векторе, как размещать на форуме.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню