Оператор скобок перегрузки C ++ [] get & set с разными типами возвращаемых значений - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь перегрузить оператор [] для класса, который я создал, с разными типами возвращаемых значений для метода получения и установки.

Я хочу, чтобы установщик возвращал ссылку на другой экземпляр класса, что в данный момент происходит нормально, проблема в том, что я хочу, чтобы получатель возвращал char, но в моем main, когда я назначаю char c = объект [5] вызывает вызывающее устройство вместо получающего и возвращает неправильный тип возвращаемого значения.

Вот как это выглядит в моем коде:

Board.h

const char& operator[](Board_Node index) const;
Board_Node& operator[](Board_Node index);

Board.cpp

const char& Board::operator[](Board_Node index) const
{
    int boardIndex = index.i * _boardSize + index.j;
    if (boardIndex < 0 || boardIndex >= _board.size())
    {
        throw IllegalCoordinateException(index.i, index.j);
    }
    return _board[index.i * _boardSize + index.j].token;
}

Board_Node & Board::operator[](Board_Node index)
{
    int boardIndex = index.i * _boardSize + index.j;
    if (boardIndex < 0 || boardIndex >= _board.size())
    {
        throw IllegalCoordinateException(index.i, index.j);
    }
    return _board[index.i * _boardSize + index.j];
}

main.cpp

char c = board1[{1, 2}]; cout << c << endl;

Эта строка приводит к ошибке: не существует подходящей функции преобразования из "Board_Node" в "char".

Уже везде перепробовал все формы с const и ничего не получалось.

Оцените любую помощь, спасибо!

1 Ответ

0 голосов
/ 08 мая 2018

Вызов перегруженных функций методов получения и установки на основе того, является ли объект const или не- const, не подходит.

Версия перегрузки, отличная от const, получает более высокий приоритет, если объект не const.

Я предлагаю добавить явно полученную функцию получения, которая может использовать перегруженную функцию operator[].

char get(Board_Node index) const
{
   return (*this)[index];
}

В соответствии с хорошей практикой будет лучше изменить тип возврата const версии функции operator[] для возврата Board_Node const&.

Board_Node const& operator[](Board_Node index) const;
Board_Node& operator[](Board_Node index);

Это позволит вам извлекать другую информацию из соответствующего Board_Node, а не просто char.

При этом вам не понадобится функция 'get function. You'll have to change usage of the operator [] `.

char c = board1[{1, 2}].token;
cout << c << endl;
...