gpt4 book ai didi

c++ - 以允许响应更新的方式重载 C++ 索引下标运算符 []

转载 作者:IT老高 更新时间:2023-10-28 12:57:04 26 4
gpt4 key购买 nike

考虑编写一个可索引类的任务,该类自动将其状态与某些外部数据存储(例如文件)同步。为了做到这一点,需要让类知道可能发生的对索引值的更改。不幸的是,重载 operator[] 的常用方法不允许这样做,例如...

Type& operator[](int index)
{
assert(index >=0 && index < size);
return state[index];
}

我有什么方法可以区分正在访问的值和正在修改的值吗?

Type a = myIndexable[2]; //Access
myIndexable[3] = a; //Modification

这两种情况都发生在函数返回之后。是否有其他方法可以重载 operator[] 可能更有意义?

最佳答案

从运营商[]你只能真正告诉访问。
即使外部实体使用非成本版本,这也不意味着会发生写入,而是可能会发生。

因此,您需要做的是返回一个可以检测修改的对象。
最好的方法是用一个覆盖 operator= 的类来包装对象。然后,该包装器可以在对象已更新时通知存储。您还需要覆盖 operator Type(强制转换),以便可以检索对象的 const 版本以进行读取访问。

然后我们可以这样做:

class WriteCheck;
class Store
{
public:
Type const& operator[](int index) const
{
return state[index];
}
WriteCheck operator[](int index);
void stateUpdate(int index)
{
// Called when a particular index has been updated.
}
// Stuff
};

class WriteCheck
{
Store& store;
Type& object;
int index;

public: WriteCheck(Store& s, Type& o, int i): store(s), object(o), index(i) {}

// When assignment is done assign
// Then inform the store.
WriteCheck& operator=(Type const& rhs)
{
object = rhs;
store.stateUpdate(index);
}

// Still allow the base object to be read
// From within this wrapper.
operator Type const&()
{
return object;
}
};

WriteCheck Store::operator[](int index)
{
return WriteCheck(*this, state[index], index);
}

一个更简单的选择是:
您不提供 operator[],而是在 store 对象上提供特定的 set 方法,并且仅通过 operator[]

提供读取访问权限

关于c++ - 以允许响应更新的方式重载 C++ 索引下标运算符 [],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3581981/

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