Как я могу перегрузить операторы класса, чтобы использовать синтаксис
classInstance[index] = value;
выполняет * * 1004
classInstance.cfgfile.Write(index,value)
справочная информация; не стесняйтесь пропустить.
Приложение, которое мы разрабатываем, использует отображенный в память доступ к сегменту NVRAM - фактически, отображенные - это всего лишь два регистра, адрес и данные. Вы пишете в адресный регистр, затем либо пишете, либо читаете регистр данных. После инициализации чтение и запись выполняются простой перегрузкой [] класса, содержащего ссылку на сегмент памяти. Вы ссылаетесь на экземпляр [], дающий пространство имен по индексу ячейки, которую вы хотите прочитать и записать, и он делает свое дело.
int& IndirectMemory::operator[](RTCMemIndex idx)
{
*midx_reg = idx;
return *mdata_reg;
}
(код лишен нерелевантных элементов, таких как мьютексы и проверки работоспособности).
Все работает нормально ... до тех пор, пока NVRAM работает нормально. Этот конкретный чип снят с производства, а те, что «в дикой природе», в настоящее время начали умирать от старости. Их функциональность не имеет большого значения для нашего использования, и мы могли бы перенести их роль на флэш-память практически без последствий (чуть больше износа флэш-памяти), если чип испортится. Дело в том, что мы хотим использовать флэш-запись, используя наш формат конфигурации, который использует геттеры и сеттеры.
int TCfgFile::ReadKey(std::string Key);
void TCfgFile::WriteKey(std::string Key,int data);
И во многих местах кода мы обращаемся к NVRAM посредством IndirectMemory[Some_Register] = Some_Value;
записи различных вещей, которые часто меняются, и мы хотим сохранить их после перезагрузки. Я хотел бы сохранить этот синтаксис и поведение, но иметь возможность записи в файл, если обнаружено, что NVRAM поврежден или отключен вручную через запись конфигурации.
Сеть изобилует примерами использования оператора [] для установки заданного значения, просто возвращая ссылку на него. Для пример :
unsigned long operator [](int i) const {return registers[i];}
unsigned long & operator [](int i) {return registers[i];}
В этом случае, если я позвоню, скажем, reg[3] = 1;
, []
вернет ссылку на элемент # 3 и по умолчанию operator=
запишет ссылку просто отлично.
Но так как я не могу вернуть ссылку на ключ в файле (.WriteKey()
просто выполняет полную запись, возвращая успех или ошибку), а operator=
не берет индекс, боюсь, это простой вариант не поможет.