C ++: отслеживание доступа к элементу массива

У меня есть класс, который я использую, чтобы отслеживать значения, принятые переменной. Я реализовал это путем перегрузки оператора =.
Пример использования:

myType var0;
var0 = 1;
var0 = 3;

генерирует на стандартный вывод:

1
3

Это отлично работает с переменными, но не с массивами. Как я могу расширить эту функцию?

0

Решение

Одним из способов будет перегрузка [] оператор для возврата «прокси» — объект, который ссылается на вашу переменную, и перегружает = оператор для отслеживания.

Вот пример реализации:

#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
2

Другие решения

То, что вы хотите сделать, это использовать прокси-класс для вашего массива и в этом классе определить функцию operator []. Очень похоже на то, как это делает std :: vector.

Вы бы проследили, когда создается неконстантная ссылка на элемент массива. Я думаю, что вы должны предположить, что это было написано. Вы бы сделали массив из вашего существующего класса, чтобы вы увидели фактическую запись.

Вывод может выглядеть так:
ссылка на элемент 32: написать 1

Или как угодно.

1

Ну, массивы не поддерживают operator= во всяком случае, так что это не настоящая проблема. Конечно, вы можете назначить отдельные элементы массива, но это уже охватывается вашими существующими operator=,

0

Вы можете создать MyArrayType, который перегружает оператор [], чтобы хранить значения внутри массива MyTypes.

0
По вопросам рекламы [email protected]