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

C++, operator [], and tracking a change

我正在尝试构建一个类似数组的 class,像这样:

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

这是我的问题 -- 如果我这样做,是否有任何类型的 hack 或技巧:

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

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

一些复杂的赋值运算符可以让我的 class 检测到“[n]=”的发生?

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

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

编译器会根据需要选择正确的 - 修改与否!

通常的解决方案是使用助手 class,例如:

struct inner_ref {
   dumb &me;
   int i;

   inner_ref(dumb &, int);

   operator int();

   dumb &operator=(int);
};

operator[] 重载 returns 这个对象,使用对 *this 的引用和 passed-in 数组索引构造它。它的 operator= 重载执行实际赋值并设置此标志。当 [] 用于访问数组的值而不是修改它时,它的 operator int() 提供了适当的语义。