我有一个类用于跟踪变量假定的值。我通过重载 operator= 来实现它。使用示例:
myType var0;
var0 = 1;
var0 = 3;
在标准输出上生成:
1
3
这适用于变量,但不适用于数组。如何扩展此功能?
一种方法是重载[]
运算符以返回一个“代理” - 一个引用您的变量的对象,并重载运=
算符以进行跟踪。
这是一个示例实现:
#include <iostream>
using namespace std;
struct myArray;
class proxy {
myArray &array;
int index;
public:
proxy(myArray &_array, int _index)
: array(_array)
, index(_index) {
}
proxy& operator=(int value);
operator int() const;
};
struct myArray {
int data[100];
proxy operator[](int index) {
return proxy(*this, index);
}
};
proxy& proxy::operator=(int value) {
cout << "Asigning " << value << " to element " << index << endl;
array.data[index] = value;
return *this;
}
proxy::operator int() const {
cout << "Reading element at " << index << endl;
array.data[index];
}
int main() {
myArray a;
a[5] = 123;
a[8] = 321;
int x = a[5];
return 0;
}
这打印
Asigning 123 to element 5
Asigning 321 to element 8
Reading element at 5
您想要做的是为您的数组使用代理类,并在该类上定义一个 operator[] 函数。很像 std::vector 是如何做到的。
您将跟踪何时生成对数组元素的非常量引用。我认为您必须假设它即将被写入。您将从现有的类中创建数组,以便看到实际的写入。
输出可能如下所示: ref to element 32: write 1
或者无论你喜欢它。
您可以创建一个 MyArrayType 重载 [] 运算符以将值内部存储在 MyTypes 数组中
好吧,无论如何数组都不支持operator=
,所以这不是一个真正的问题。当然,您可以分配给单个数组元素,但这已经包含在您现有的operator=
.