c++ - 尝试将 Ruby 自定义数组访问器转换为 C++ 下标运算符覆盖
问题描述
我正在学习如何使用“程序员迷宫:编写自己的曲折小通道”一书来生成迷宫。这些示例都使用 Ruby。我目前正在学习高级 C++,我想转换这段代码。
def [](row, column)
return nil unless row.between?(0, @rows - 1)
return nil unless column.between?(0, @grid[row].count - 1)
@grid[row][column] end
#Buck, Jamis. Mazes for Programmers: Code Your Own Twisty Little Passages
#(p. 21). Pragmatic Bookshelf. Kindle Edition.
上面的代码从给定行和列的网格中返回一个 Cell 对象,如果这样的 Cell 存在的话。我研究过在 C++ 中覆盖 [] 运算符,但 Ruby 实现使用二维数组。我完全不知道如何实现它来检查行和列。
这是 Grid 类的标题:
#include "Cell.h"
class Grid
{
private:
int rows;
int columns;
vector<vector<Cell>> grid;
public:
Grid(int, int);
~Grid();
void prepareGrid();
void configureCells();
Cell &operator[] (int,int);
};
我希望能够做这样的事情:
Cell & Grid::operator[](int row, int column)
{
if (row >= rows) {
return NULL;
}
else if (column >= columns) {
return NULL;
}
else {
return grid[row][column];
}
}
- 编辑澄清
:C++ 运算符 [] 不允许使用多个参数,因此我无法通过访问器的单个覆盖来检查行和列
我也意识到在这种情况下返回 NULL 是无效的,需要弄清楚如何解决这个问题。
解决方案
我完全不知道如何实现它来检查行和列。
使用and
或&&
像这样:
if (row < rows && column < columns)
{
// success
}
else
{
// fail
}
为了指示失败,您可以更改函数签名以返回 a Cell*
,这将允许您返回 a nullptr
(不要使用NULL
),或者您可以抛出异常。
推荐阅读
- reactjs - 反应 npm 生产构建问题
- python - Python 程序停止,当 n > 373 且始终在第 32 行时
- ruby-on-rails - MacOS上安装Ruby、gem和redis的问题
- javascript - 根据 css 属性选择元素
- html - 为什么这些按钮没有垂直排列?我的css有问题吗?
- reactjs - 在事件处理程序中调用自定义挂钩
- node.js - 当我使用 url http://localhost:3000/dashboard 时,nodejs 没有向 reactjs 发送响应
- php - Web 服务器如何在不安装的情况下为网站查看者工作?
- python - Pyinstaller 不适用于导入的模块
- python - QP 后退地平线路径规划问题