Попытка преобразовать собственный обработчик массива Ruby в переопределение оператора индекса C ++ - PullRequest
0 голосов
/ 27 марта 2019

Я учусь создавать лабиринты с книгой «Лабиринты для программистов: создайте свои собственные маленькие извилистые места».Все примеры приведены на 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 использует 2d массив.Я полностью заблудился, как реализовать это для проверки строк и столбцов.


Вот заголовок для класса сетки:

#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 недопустимо в этой ситуации, и мне необходимо выяснить, как обойти это.

1 Ответ

0 голосов
/ 27 марта 2019

Я полностью потерян, как реализовать это для проверки строк и столбцов.

Используйте and или &&, например:

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

Для обозначения ошибки вы можете изменить сигнатуру функции, чтобы она возвращала Cell*, что позволило бы вам вернуть nullptr (не используйте NULL), или вы можете вызвать исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...