尝试将Ruby自定义数组访问器转换为C ++下标运算符覆盖

时间:2019-03-27 05:05:00

标签: c++ ruby

我正在用《迷宫程序员:编写自己的曲折小段落》一书学习如何产生迷宫。这些示例全部使用Ruby。我目前正在学习高级C ++,我想转换此代码。

var subDays = require('date-fns/sub_days')
var olderDate = subDays(new Date(2019, 28, 3), 30)

await User.find({ 
   creationDate: {
      $gte: olderDate
   }
});

上面的代码从给定的行和列的网格中返回一个Cell对象(如果存在)。我已经研究了在C ++中重写[]运算符,但是Ruby实现使用2d数组。我完全不知道如何实现此功能以同时检查行和列。


这是网格类的标题:

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.

我希望能够做这样的事情:

#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);
};

  • 编辑以澄清

:C ++运算符[]不允许使用多个参数,因此我无法使用访问器的单个覆盖来同时检查行和列

我还意识到在这种情况下返回NULL无效,因此需要弄清楚如何解决。

1 个答案:

答案 0 :(得分:0)

  

我完全不知道如何实现此功能以同时检查行和列。

像这样使用and&&

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

要指示失败,您可以更改函数签名以返回Cell*,这将允许您返回nullptr(不要使用NULL),也可以引发异常。