Создание 2-мерного вектора в классе C

#c #class #vector

#c #класс #вектор

Вопрос:

Мне нужно создать вектор из векторов, полных целых чисел. Однако я постоянно получаю ошибки:

ошибка: ожидаемый идентификатор перед числовой константой ошибка: ожидаемый ‘,’ или ‘…’ перед числовой константой

 using namespace std;

class Grid {
  public:

  Grid();

  void display_grid();
  void output_grid();

  private:

  vector<int> row(5, 0);
  vector<vector<int> > puzzle(9, row);
  int rows_;
  int columns_;

};
  

Комментарии:

1. Было бы полезно, если бы у вас были некоторые базовые знания C . Например, как инициализировать данные члена класса.

Ответ №1:

Вы не можете инициализировать переменные-члены в точке, где вы их объявляете. Для этого используйте список инициализации в конструкторе:

 Grid::Grid()
  : row(5,0), puzzle(9, row),
    rows_(5), columns_(9)
{
}
  

Ответ №2:

Определения классов C ограничены тем, что вы не можете инициализировать элементы в строке, где вы их объявляете. Жаль, но это в некоторой степени исправлено в C 0x.

В любом случае, вы все равно можете предоставить параметры конструктора с ctor-initializer синтаксисом. Возможно, вы не видели этого раньше, но:

 struct T {
   T() : x(42) {
      // ...
   }

   int x;
};
  

так вы инициализируете элемент, когда вы, возможно, ранее пытались (и потерпели неудачу) с int x = 42; .

Итак:

 class Grid {
  public:

  Grid();

  void display_grid();
  void output_grid();

  private:

  vector<int> row;
  vector<vector<int> > puzzle;
  int rows_;
  int columns_;
};

Grid::Grid()
  : row(5, 0)
  , puzzle(9, row)
{
  // ...
};
  

Надеюсь, это поможет.

Ответ №3:

Вы не можете инициализировать элемент в объявлении класса, если это не const static , потому что в C никакой код не запускается / не генерируется при объявлении класса. Вам придется инициализировать их в вашем конструкторе.

Ответ №4:

Вы должны инициализировать члены в конструкторе класса, а не в объявлении. Следующее, похоже, ни в коем случае не является правильным:

 vector<int> row(5, 0);
vector<vector<int> > puzzle(9, row);
  

Если row и puzzle являются функциями — параметры должны быть типами. Если они являются переменными-членами — инициализируйте их в конструкторе класса.

Комментарии:

1. Как они функционируют? Они являются объектами, и они создаются с аргументами (или таково было намерение).

2. Я знаю, что таково было намерение, я указываю, что синтаксис неправильный. Использование круглых скобок в определении члена класса предназначено для функций.

Ответ №5:

Вы не можете инициализировать изменяемые элементы как часть самого определения класса. Вместо этого сделайте присвоение его в конструкторе.

 // ....
Grid()
{
     row.resize(5,0) ;
     puzzle.resize(9,row) ;
}
private:
   vector<int> row;
   vector<vector<int> > puzzle ;
// ..
  

Комментарии:

1. @Tomalak — Я запутался между терминами присваивание и инициализация. Какая правильная терминология для использования того, что делает OP? Я тоже не думаю, что это присваивание.

2. Операционная система пытается выполнить инициализацию. Ваш код не выполняет (хотя конечный результат здесь действительно тот же), поскольку вы вызываете функции для полностью сконструированных объектов, а не передаете параметры конструктора.

3. @Tomalak — Если мой ответ сбивает с толку, чтобы сказать это как инициализацию, я прошу прощения.

4. Просто неправильно говорить. 🙂 Демонстрируемый вами подход, конечно, все еще актуален.