Initializing a matrix made of vectors inside constructor of class
我正在尝试建立一个有字符矩阵的游戏。我试图用向量向量向量来建立我的矩阵。我的
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>}’ and ‘char’) this->matrix[i][j] = ' '; ^~~ |
线上:
1 | this->matrix[i][j] = ' '; |
我想知道是什么导致了这种情况,以及如何在构造函数中将所有内容设置为空白?
因此,
1 | this->matrix[i][j] = ' '; |
不起作用。
简化代码。将
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对象[索引]一样)
有了这个代码,代码看起来一定很优雅和专业:)