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()
提供了适当的语义。
我正在尝试构建一个类似数组的 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()
提供了适当的语义。