C++、运算符[]和跟踪更改



我正在尝试构建一个小数组ish类,如下所示:

class dumb
{
bool mChanged=false;
int mData[1000];
int& operator [](int i) {return mData[i];}
};

这是我的问题——如果我这样做了,我能做什么黑客或把戏吗:

dumb aDumbStuff;
aDumbStuff[5]=25;  <- now mChanged gets set to true!

因此,基本上,如果我修改任何内容,我希望类的mChanged值为true。有什么方法可以做到这一点,而不让数组本身成为它们自己跟踪的对象的数组,或者通过执行memcmp来查看事情是否发生了变化?

一些复杂的赋值运算符的舞蹈会让我的类检测到";[n] =";发生

通常的解决方案是使用一个助手类,类似于:

struct inner_ref {
dumb &me;
int i;
inner_ref(dumb &, int);
operator int();
dumb &operator=(int);
};

operator[]重载返回此对象,使用对*this的引用和传入的数组索引来构造它。其operator=重载执行实际分配,并设置此标志。当[]用于访问数组的值而不是修改它时,它的operator int()提供了适当的语义

您可以在现有的operator[]方法中将标志设置为"changed",并添加第二个版本,其中const返回int(=不作为引用(:

int operator [](int i) const {return mData[i];}

编译器会选择正确的一个——根据需要修改或不修改!

最新更新