Инициализация матрицы из векторов внутри конструктора класса - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь создать игру с матрицей символов. Я пытаюсь использовать вектор векторов для построения моей матрицы. У моего game.h есть это:

#ifndef GAME_H
#define GAME_H
// includes
using namespace std;
class Game 
{
  private:
    int row;
    int col;
    vector<vector<char>>* matrix;
    // other atributtes

  public:
    Game();
    ~Game(){}
    // some functions
};
#endif

А по моему game.cpp:

Game::Game()
{
    this->col = 20;
    this->row = 20;
    // Initialize the matrix
    this->matrix = new vector<vector<char>>(this->col);
    for(int i = 0 ; i < this->col ; i++)
       this->matrix[i].resize(this->row, vector<char>(row));
    // Set all positions to be white spaces
    for(int i = 0 ; i <  this->col; i++)
      for(int j = 0 ; j < this->row ; j++)
        this->matrix[i][j] = ' ';
}

Это дает мне ошибку:

error: no match for ‘operator=’ (operand types are ‘__gnu_cxx::__alloc_traits<std::allocator<std::vector<char> > >::value_type {aka std::vector<char>}’ and ‘char’)
     this->matrix[i][j] = ' ';
                          ^~~

в строке:

this->matrix[i][j] = ' ';

Я хотел бы знать, что является причиной этого, и как я могу установить, чтобы все было пустым пространством в моем конструкторе?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

На вашем месте я бы сделал это так:

в games.hpp:

#ifndef GAME_H
#define GAME_H
// includes
template <class T>
class Game : public std::vector<std::vector<T>>
{
     private:
        int row;
        int col;

    public:
        Game();
       ~Game(){}
// some functions
};
#endif

в games.cpp

template<class T>
Game<T>::Game(int rr=20, int cc=20):
    row(rr), col(cc), std::vector<std::vector<T>>(rr, std::vector<T>(cc))
{
 //empty body   
}

Естественно, это усложнит способ доступа к элементам, но это легко сделать, перегружив оператор (), который возвращает ссылку на позицию, к которой вы хотите получить доступ. Обратите внимание, что публично наследуя std :: vector, мы унаследовали все их операторы, а также функции-члены и переменные Следовательно, мы также унаследовали перегруженный оператор [] в классе std :: vector. Следовательно, мы можем получить доступ к любому элементу перегруженным оператором, как показано ниже:

template<class T>
T& Game<T>::operator()(int rr, int cc){
return this->operator[](rr)[cc];
}

В приведенном выше операторе return первая часть вызывает перегруженный оператор [] с аргументом rr, который возвращает векторный объект, и для этого векторного объекта мы снова вызываем перегруженный оператор [], вызывая его с аргументом 'cc' как индекс столбца (как мы сделали бы с объектом std :: vector [index])

При этом код, безусловно, выглядит элегантно и профессионально:)

0 голосов
/ 15 мая 2018

Тип this->matrix равен std::vector<std::vector<char>>*.

Тип this->matrix[i] равен std::vector<std::vector<char>>

Тип this->matrix[i][j] равен std::vector<char>.

Следовательно,

this->matrix[i][j] = ' ';

не работает.

Упростите ваш код.Измените matrix на

std::vector<std::vector<char>> matrix; // Remove the pointer

Настройте свой код соответствующим образом.

...