c++ - 如何重载运算符以在 operator[] 调用中调用 setter 函数?

标签 c++ operator-overloading getter-setter

如何重载类的运算符,以便使用

的语法
classInstance[index] = value;

执行

classInstance.cfgfile.Write(index,value)

背景信息;随意跳过。

我们开发的应用程序使用内存映射访问一段 NVRAM - 实际上,映射的只是两个寄存器,地址和数据。您写入地址寄存器,然后写入或读取数据寄存器。初始化后,读取和写入由保存对内存段的引用的类的简单 [] 重载执行。你引用实例的 [] 给出你想要读写的单元格的命名空间索引,它会做它的事情。

int& IndirectMemory::operator[](RTCMemIndex idx)
{
    *midx_reg = idx;
    return *mdata_reg;
}

(代码去除了不相关的元素,如互斥锁和健全性检查)。

一切正常...只要 NVRAM 正常工作。这个特定的芯片已经停产,那些“在野外”的芯片目前开始老化。它们的功能对我们的使用意义不大,如果芯片损坏,我们可以将它们的角色转移到闪存而几乎没有影响(只是闪存磨损多一点)。事情是我们想使用我们的配置格式的闪存记录,它使用 getter 和 setter。

int TCfgFile::ReadKey(std::string Key);
void TCfgFile::WriteKey(std::string Key,int data);

在代码的许多地方,我们通过 IndirectMemory[Some_Register] = Some_Value; 调用 NVRAM,编写各种经常更改的内容,我们希望通过重启保持不变。我想保留此语法和行为,但如果检测到 NVRAM 已损坏或通过配置条目手动禁用,则能够写入文件。


网络上充斥着使用 operator[] 仅通过返回对它的引用来设置给定值的例子。对于 example :

unsigned long operator [](int i) const    {return registers[i];}
unsigned long & operator [](int i) {return registers[i];}

在这种情况下,如果我调用 reg[3] = 1; [] 将返回对元素#3 的引用和默认的 operator= 将很好地写入引用。

但由于我无法返回对文件中键的引用(.WriteKey() 只是执行完整的写入,返回成功或错误),并且 operator= 不带索引,恐怕这个简单的选项无济于事。

最佳答案

您可以使用代理类来解决这个问题。由于 value 无法传递到 classInstance 中,我们需要创建一个 operator[] 可以返回的对象,该对象将获取 的值>value 并知道将操作应用到哪个实例。使用

struct Proxy
{
    classInstance_type& to_apply;
    index_type index;
    Proxy(classInstance_type& to_apply, index_type index) : to_apply(to_apply), index(index) {}
    Proxy& operator=(value_type const & value)
    {
        to_apply.cfgfile.Write(index,value)
        return *this;
    }
};

你类(class)的 operator[] 看起来像

Proxy operator[](index_type index)
{
    return Proxy{*this, index};
}

然后当您执行 classInstance[index] = value; 时,您调用了 Proxyoperator=,它引用了该对象调用、要使用的索引以及您还需要的值。

关于c++ - 如何重载运算符以在 operator[] 调用中调用 setter 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54292588/

相关文章:

c++ - 将 C/C++ 线程附加到套接字

c++ - Blackmagic 帧 : convert from yuv to RGB to use in openCV

c++ - 实现 Matrix 类加法运算符重载奇怪的输出

python - 何时在 python 中使用运算符重载的经验法则

c++ - 确定在 C++ 代码中调用了哪些复制构造函数

java - 有什么理由不为 JPA 中的 @Id 字段生成 setter 和 getter 吗?

c++ - 消除函数参数的复制

c++ - 取消引用已分配特定内存地址的指针

java - 如何在不使用 private 的情况下强制使用 setter 方法? (公共(public)用于读取,私有(private)用于写入)

java - java中具有逻辑的setter