gpt4 book ai didi

C++ 运算符 [] 重载 SNAFU

转载 作者:太空狗 更新时间:2023-10-29 23:52:05 35 4
gpt4 key购买 nike

我有一个类,我想为其定义 [] 运算符。该类包含一个串行数据包(以及对所述数据包进行操作的相关函数)。我想让用户有能力做这样的事情......

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;

虽然我相当确定这会奏效,但我对我的方法仍有一些不确定性,我希望你们能帮助我解决我的问题。

  1. 只返回值而不是引用是否“可以”?我知道在我见过的所有示例中都会返回一个引用。返回一个值是否可以帮助我解决我不想在操作左侧使用“[]”的事实?再说一次,const 不会阻止这种情况吗?

  2. 即使在非 const 对象上也会调用 const 函数吗?我见过一些示例,其中声明了运算符的 const 版本和运算符的非 const 版本。 non-const 允许写入,而 const 只允许读取,但只为 const 对象调用。我的目标是即使是非 const 对象也只能从中读取。

  3. 是否有一种干净的方法来传递运算符(operator)的错误?我的主要问题是所请求的数据可能超出了我拥有的数据范围。我见过的所有示例都使用断言,但我不一定希望程序在用户对运算符(operator)的调用引起某种欢闹的情况下崩溃。我也不一定会传回特殊代码,因为我传回的字节的任何值都可能有效。

一如既往,感谢您的帮助,因为我正在慢慢地(但肯定地)实现从 C 程序员到 OO C++ 向导的可怕转变。

最佳答案

  1. 是的,对于像 uint8_t 这样的小类型,简单地返回一个值就可以了。您可以返回一个 const 引用,const 确实会阻止任何人通过它进行写入。但是对于像 uint8_t 这样的小类型,按值返回是一个更好的主意。请注意,顺便说一句,当按值返回时,您不再需要返回类型上的 const

    返回一个 const 引用,即使它阻止修改,也使调用代码能够创建和存储潜在的长期引用和指向数组元素的指针,如

    const uint8_t *byte = &packet[3];

    如果这是不可取的,那么按值返回也会阻止该功能。

  2. 是的,const 版本的函数将为非 const 对象调用(假设您没有提供非 const 版本)。

  3. 异常是专门为此目的引入的。异常为错误情况提供了专用反馈路径,而不会影响函数声明和规范(即,您不必为错误返回保留任何值,也不必为此目的引入任何参数)。

    <

关于C++ 运算符 [] 重载 SNAFU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17507370/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com