У меня есть класс, который я использую, чтобы отслеживать значения, принятые переменной. Я реализовал это путем перегрузки оператора =.
Пример использования:
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.
Вы бы проследили, когда создается неконстантная ссылка на элемент массива. Я думаю, что вы должны предположить, что это было написано. Вы бы сделали массив из вашего существующего класса, чтобы вы увидели фактическую запись.
Вывод может выглядеть так:
ссылка на элемент 32: написать 1
Или как угодно.
Ну, массивы не поддерживают operator=
во всяком случае, так что это не настоящая проблема. Конечно, вы можете назначить отдельные элементы массива, но это уже охватывается вашими существующими operator=
,
Вы можете создать MyArrayType, который перегружает оператор [], чтобы хранить значения внутри массива MyTypes.