У меня 2 класса - Board построено для числа n и создана доска из Cell объекта размером n*n

class XOBoard {
    private:
        int n;
        Cell **Board;
        Cell empty_cell{};
        bool valid_range(int y, int x, int n) const;
    public: 
    Cell& operator[](list<int> list) {
        int x = list.front(), y = list.back();
        if (!valid_range(y, x, n)) return empty_cell;
        return Board[x][y];
    }
};


class Cell {
private:
    char validate(char in);
public:
    char ch;
    Cell(char ch = '.');
    char getCell() const;
    void setCell(char ch);
    friend ostream& operator<<(ostream& output, const Cell& cell) {
        output << cell.ch;
        return output;
    }
    Cell& operator=(const char another) {
        ch = validate(another);
        return *this;
    }
    Cell operator=(const Cell& another) {
        Cell empty;     
        if (this != &another) {         
            if (!(ch != '.' && ch != 'X' && ch != 'O')) {                   
                ch = another.ch;                
            }
            else {
                cout << "illegal" << endl;
                return empty;
            }
        }
        return *this;
    }

};

Требуется, чтобы эта линия работала: char c = board1[{1, 2}].getCell(); cout << c << endl;.

board1[{1, 2}] -> это возвращает объект Cell, и я хочу, чтобы при печати или помещении его в переменную char он перешел к getCell().

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

Спасибо вам.

0
itzikb 13 Дек 2019 в 13:07
1
Вы можете определить преобразование Cell::operator char(), но я был бы очень осторожен, если вы действительно этого хотите. Это может вызвать неожиданные преобразования в других частях кода (например, при передаче Cell функции, принимающей char)
 – 
dave
13 Дек 2019 в 13:26
Если вас интересует только печать, тогда добавление operator<<(std::ostream&, const Cell&) сделает работу. Для чего еще нужно преобразование в char?
 – 
Max Langhof
13 Дек 2019 в 14:58

2 ответа

Вы можете перегрузить оператор индекса, чтобы получить структуру с двумя членами типа int.

struct Point
{
    int x, y;
};


class Board
{
    Cell& operator[](Point p)
    {
        // validate
        // return Board[p.x][p.y];
    }
}
0
Sumudu 13 Дек 2019 в 13:43

Спасибо, Дэйв, что дал мне решение.

Чтобы переопределить метод char c = board[{1,2}], что доска является некоторым объектом, вы должны использовать:

operator char const() {
    return ch;
}
0
itzikb 16 Дек 2019 в 10:22