0

我有一个类用于跟踪变量假定的值。我通过重载 operator= 来实现它。使用示例:

myType var0;
var0 = 1;
var0 = 3;

在标准输出上生成:

1
3

这适用于变量,但不适用于数组。如何扩展此功能?

4

4 回答 4

2

一种方法是重载[]运算符以返回一个“代理” - 一个引用您的变量的对象,并重载运=算符以进行跟踪。

这是一个示例实现:

#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
于 2013-10-29T16:15:17.643 回答
1

您想要做的是为您的数组使用代理类,并在该类上定义一个 operator[] 函数。很像 std::vector 是如何做到的。

您将跟踪何时生成对数组元素的非常量引用。我认为您必须假设它即将被写入。您将从现有的类中创建数组,以便看到实际的写入。

输出可能如下所示: ref to element 32: write 1

或者无论你喜欢它。

于 2013-10-29T16:13:02.347 回答
0

您可以创建一个 MyArrayType 重载 [] 运算符以将值内部存储在 MyTypes 数组中

于 2013-10-29T16:12:01.767 回答
0

好吧,无论如何数组都不支持operator=,所以这不是一个真正的问题。当然,您可以分配给单个数组元素,但这已经包含在您现有的operator=.

于 2013-10-29T16:09:19.513 回答