我有一个类,我想为其定义 [] 运算符。该类包含一个串行数据包(以及对所述数据包进行操作的相关函数)。我想让用户有能力做这样的事情......
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 版本和运算符的非常量版本。non-const 允许写入,而 const 只允许读取,但仅对 const 对象调用。我的目标是让非常量对象也只能被读取。
有没有一种干净的方法可以从操作员那里传递错误?我的主要问题是请求的数据可能超出了我拥有的数据的范围。我见过的所有示例都使用了断言,但我并不一定希望程序在用户对操作员的调用引起某种欢闹的情况下崩溃。我也不一定会传回特殊代码,因为我传回的字节的任何值都可能是有效的。
一如既往,感谢您的帮助,因为我慢慢地(但肯定地)从 C 程序员到 OO C++ 向导的可怕转变。