首页 > 解决方案 > 尝试将 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 是无效的,需要弄清楚如何解决这个问题。

标签: c++ruby

解决方案


我完全不知道如何实现它来检查行和列。

使用and&&像这样:

if (row < rows && column < columns)
{
    // success
}
else
{
    // fail
}

为了指示失败,您可以更改函数签名以返回 a Cell*,这将允许您返回 a nullptr(不要使用NULL),或者您可以抛出异常。


推荐阅读