[] 演算子を定義したいクラスがあります。このクラスは、シリアル パケットを (そのパケットを操作するための関連関数と共に) 保持します。ユーザーがこのようなことをできるようにしたいと思います...
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;
これが機能することはかなり確信していますが、私のアプローチにはまだいくつかの不確実性があり、あなたが私の問題を解決してくれることを望んでいました.
参照ではなく値を返すだけで「OK」ですか?私が見たすべての例で参照が返されることを知っています。値を返すことは、操作の左側で「[]」を使用したくないという事実を回避するのに役立ちますか? 繰り返しますが、const はこれを妨げませんか?
const関数は非constオブジェクトでも呼び出されますか? const バージョンの演算子と非 const 演算子が宣言されている例をいくつか見てきました。非 const は書き込みを許可しますが、const は読み取りのみを許可しますが、const オブジェクトに対してのみ呼び出されます。ここでの私の目標は、const 以外のオブジェクトでさえ、読み取りのみができるようにすることです。
オペレーターからエラーを渡すクリーンな方法はありますか? 私の主な問題は、要求されているデータが私が持っているデータの範囲外にある可能性があることです。私が見たすべての例はアサートを使用していますが、ユーザーのオペレーターへの呼び出しがある種の陽気さを引き起こした場合に、必ずしもプログラムがクラッシュすることを望んでいません。また、返すバイトの値はすべて有効である可能性があるため、必ずしも特別なコードを返すことはできません。
いつものように、C プログラマーから OO C++ ウィザードへとゆっくりと (しかし確実に) 恐るべき移行を行っているので、あなたの助けに感謝します。