关于c ++:在类的构造函数中初始化由向量组成的矩阵

Initializing a matrix made of vectors inside constructor of class

我正在尝试建立一个有字符矩阵的游戏。我试图用向量向量向量来建立我的矩阵。我的game.h有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#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

在我的书中1〔1〕中:

1
2
3
4
5
6
7
8
9
10
11
12
13
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] = ' ';
}

它给了我一个错误:

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

线上:

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

我想知道是什么导致了这种情况,以及如何在构造函数中将所有内容设置为空白?


this->matrix的类型为std::vector>*

this->matrix[i]型为std::vector>型。

this->matrix[i][j]的类型为std::vector

因此,

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

不起作用。

简化代码。将matrix改为

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

相应地调整代码。


如果我是你,我会这样做:

在游戏中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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

在游戏中

1
2
3
4
5
6
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  
}

这自然会使访问元素的方式复杂化,但可以通过重载返回对要访问位置的引用的operator()来轻松完成。注意,通过公开继承std::vector,我们继承了它们的所有运算符、成员函数和变量。因此,我们还继承了std::vector类中的重载运算符[]。因此,我们可以通过如下所示的重载运算符访问任何元素:

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

在上面的RETURN语句中,第一部分使用参数rr调用重载运算符[],该参数返回一个向量对象,在这个向量对象上,我们使用参数"cc"作为列索引调用重载运算符[](就像使用std::vector对象[索引]一样)

有了这个代码,代码看起来一定很优雅和专业:)