У меня есть класс, который я бы хотел определить для оператора []. Класс содержит последовательный пакет (вместе со связанными функциями для работы с указанным пакетом). Я хотел бы иметь пользователь имеет возможность сделать что-то вроде этого ...Оператор C++ [] Перегрузка SNAFU
MyClass packet;
uint8_t byte = packet[3]; // get third byte of packet
Я хотел бы запретить пользователю делать это ...
packet[3] = 0xAA; // this breaks encapsulation for my class :(
Я смотрел вокруг для решения, и мне было интересно, если это заявление было бы все, что мне нужно (вместе с соответствующим кодом в моем .cpp):
const uint8_t operator[](const std::size_t index) const;
Хотя я абсолютно уверен, что это будет работать, я до сих пор какой-то о моем подходе, и я надеялся, что вы сможете помочь мне в моих проблемах.
Действительно ли это «нормально», чтобы просто вернуть значение, а не ссылку? Я знаю, что во ВСЕХ примерах, которые я видел, возвращается ссылка. Возвращает ли значение значение, которое помогает мне обойти тот факт, что я не хочу, чтобы «[]» использовался в левой части операции? Опять же, разве const не предотвращает это?
Будет ли функция const вызываться даже на неконстантном объекте? Я видел несколько примеров, когда есть версия const оператора и неконстантная объявленная оператором. Неконстант допускает запись, тогда как константа разрешает чтение, но вызывается только для объектов const. Моя цель состоит в том, чтобы иметь даже неконстантные объекты только возможность чтения.
Есть ли чистый способ передать ошибки от оператора? Моя основная проблема заключается в том, что запрашиваемые данные могут быть за пределами данных, которые у меня есть. Все примеры, которые я видел, используют утверждение, но я не обязательно хочу, чтобы программа выпадала из строя в том случае, если вызов пользователя к оператору вызывает какой-то веселье. Я также не могу обязательно передавать специальный код, поскольку любое значение байта, которое я передаю, может быть действительным.
Как всегда, спасибо за вашу помощь, как я медленно (но верно) сделать страшный переход от того, чтобы быть C программисту мастера OO C++.
У вас действительно есть требование, чтобы ваш код не компилировался в системе, где char больше 8 бит? Потому что это то, что делает 'uint8_t': он не существует, если у системы нет неподписанного типа с ** точно ** 8 бит. Разумеется, 'uint_least8_t' или' uint_fast8_t' более уместен. Или даже лучше, 'unsigned char', который всегда будет не менее 8 бит. –
Я использую uint_8t, так как это предпочтительный метод в руководстве по стилю Google http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Integer_Types. Кроме того, класс пакета никогда не будет запущен в системе, где я не могу получить беззнаковый тип ровно 8 бит. –
Руководство по стилю Google имеет репутацию часто ошибочного. Это, безусловно, здесь, поскольку он излишне делает код не переносным. –