Статья: Модуль для работы с ассоциативными массивами в C++ Builder
Если же вместо переменной подобной структуры использовать ассоциативный массив – всё что потребуется функции сохранения – перед началом работы сформировать список ключей этого массива и в цикле по списку ключей, сохранить каждый элемент, основываясь на его типе.
Это могло бы выглядеть так:
bool savePreferences(ass_arr* pref)
{
int i;
Variant v;
// цикл по всем элементам
for (i = 0; i < pref->Count(); i++)
{
// извлекаем очередной элемент
v = (*pref)[pref->key(i)].v()
// если элемент числового типа,
// сохраняем его числовое значение
if (VarType(v) == varInteger)
{
saveInteger((*pref)[pref->key(i)].asInteger());
}
// далее для других типов
...
}
}
Как быть, если нужно заполнить данными настроек Builder'овскую форму? Потребуется ещё одна функция. При использовании ассоциативных массивов эту процедуру можно автоматизировать.
А главное: при добавлении в массив настроек нового поля – не нужно ничего менять.
Существует ещё много подобных задач. Ассоциативные массивы – универсальное средство. Но как реализовать их в C++?
Реализация ассоциативных массивов в C++ Builder
Для реализации класса ассоциативного массива, я использовал несколько стандартных классов: во-первых, Variant – мультитип. В переменной типа Variant может хранится значение любого из стандартных типов. Во-вторых, CList – для создания внутренних списков. Поэтому, вне Builder'а – например, в MSVC++, этот класс работать не будет. Однако, при большом желании, его можно портировать (использовав list из stl и написав свою реализацию Variant).
Моя библиотека содержит три класса: ass_arrEl – класс элемента массива, ass_arr – класс простого ассоциативного массива, и его наследник – prop_ass_arr, предназначенный для работы с окнами настройки. Он «умеет» сохранять и загружать своё содержимое из реестра, заполнять им формы и заполняться содержимым формы сам.
Как работать с моими классами
Несколько наглядных примеров:
Простой массив. Работа со значениями.