Почему для этого требуется const_cast?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему для этого требуется const_cast?

Сообщение Anonymous »

У меня есть класс Chess, который кодирует состояния клеток на доске как 4-битные целые числа. Чтобы абстрагироваться от этого, я делаю, как мне кажется, стандартный трюк: создаю класс, который эмулирует ссылку, чтобы разрешить использование оператора вызова/индексации.
Проблема в том, что перегрузка const OptPieceRef не может скомпилироваться. Использование const_cast работает; однако это не имеет смысла. Неконстантная OptPieceRef перегрузка не требует таких махинаций, и у меня сложилось сильное впечатление, что const функции и объекты не придают константности соответствующим переменным-членам. У меня сложилось впечатление, что разработчик класса может делать все, что захочет, и что это просто тот случай, когда объекты const могут вызывать только функции const.
У меня есть два вопроса, а именно вышеупомянутый вопрос: почему, и создал ли я неопределенное поведение? Я не думаю, что создал неопределенное поведение, потому что, помимо того факта, что код работает, в этом ответе на переполнение стека говорится, что const_cast в порядке, пока базовый объект не является const. Тем не менее, я хочу быть уверенным.
Я добавил класс PieceRef, чтобы обеспечить более прямой доступ (относительно интерфейса программиста) к виртуальным (народным, а не ключевым словам) членам структуры Piece, аналогично тому, что предложил Реми Лебо.
#include "Chess.h"
#include

int main() {
Chess::Piece piece = Chess::Piece();
piece.color = Chess::Piece::Color::White;
piece.kind = Chess::Piece::Kind::Rook;

Chess chess = Chess();
chess.board(3, 3) = piece;

std::cout
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»