C++ C++;运算符[]重载SNAFU
我想为一个类定义[]运算符。该类持有一个串行数据包(以及对该数据包进行操作的相关函数)。我想让用户有能力做这样的事情C++ C++;运算符[]重载SNAFU,c++,operator-overloading,constants,C++,Operator Overloading,Constants,我想为一个类定义[]运算符。该类持有一个串行数据包(以及对该数据包进行操作的相关函数)。我想让用户有能力做这样的事情 MyClass packet; uint8_t byte = packet[3]; // get third byte of packet 我想阻止用户这样做 packet[3] = 0xAA; // this breaks encapsulation for my class :( 我一直在寻找解决方案,我想知道这个声明是否就是我所需要的(以及.cpp中的相关代码):
MyClass packet;
uint8_t byte = packet[3]; // get third byte of packet
我想阻止用户这样做
packet[3] = 0xAA; // this breaks encapsulation for my class :(
我一直在寻找解决方案,我想知道这个声明是否就是我所需要的(以及.cpp中的相关代码):
虽然我相当肯定这会奏效,但我对我的方法仍有一些不确定性,我希望你能帮助我解决我的问题
一如既往,感谢您的帮助,因为我慢慢地(但肯定地)从C程序员到OcC++向导的可怕转变。
uint8\t
这样的小类型,只返回一个值是可以的。您可以返回const引用,const
确实会阻止任何人通过它进行写入。但是对于像uint8\t
这样的小类型,按值返回是一个更好的主意。请注意,顺便说一句,当按值返回时,您不再需要返回类型上的const
返回常量引用(即使很难防止修改)使调用代码能够创建和存储指向数组元素的潜在长期引用和指针,如中所示
const uint8_t *byte = &packet[3];
如果这是不需要的,那么按值返回也会阻塞该功能const
版本(假设您没有提供非常量版本)引用方法的优点是可以避免值的副本,如果运算符[]的返回值较大,则可以提高效率/空间。如果您只希望运算符[]的返回值存在一个副本,则必须使用(const)引用。您真的要求代码不能在字符大于8位的系统上编译吗?因为这就是
uint8\u t
所做的:它不存在,除非系统有一个正好有8位的无符号类型。当然uint\u-least8\u-t
或uint\u-fast8\u-t
更合适。或者更好的是,unsigned char
,它将始终至少是8位。我使用uint_8t,因为根据谷歌的样式指南,这是首选方法。此外,packet类永远不会在一个我无法获得8位的无符号类型的系统上运行。谷歌的样式指南以经常被误导而闻名。它当然在这里,因为它不必要地使代码不可移植。
const uint8_t *byte = &packet[3];
packet[3] = 0xAA;