Реализуем методы для класса-шаблона ТАггау (см. листинг 11.9). Если метод save () написать относительно легко, то метод load() требует более пристального внимания. Метод похож на операцию присваивания: нужно создать новый динамический массив, в который скопировать сохраненные данные, а прежний массив уничтожить. Таким образом, метод save() должен сохранить и поле size_array, и сами элементы динамического массива (листинг 14.10).
Листинг 14.10. Методы save() и load() для массива ТАггау
template <class Т, std::size_t n> void TArray<T,n>::save()
{ tmpnam(name); // генерация случайного имени
std::ofstream file(name, std::ios::binary);
if(file.is_open())
{ file.write((char*)&size_array, sizeof(size_type));
file.write((char*) data, sizeof(value_type)*n);
}
file.closeO : return;
}
template <class T, std::size_t n> void TArray<T,n>::load()
{ std::ifstream file(name, std::ios::binary); if(file.is_open())
{ file.read((char*)&size_array, sizeof(size_type));
value_type *p = data; // сохранили для возврата
data = new T[size_array]; // новый массив
file.read((char*) data, sizeof(value_type)*n); delete[]p;
}
file.closeO ; return;
}
Поле name описано в приватной части класса ТАггау так: char name[13];
Метод save() в начале работы генерирует случайное имя, открывает поток на запись и выводит данные в файл, который тут же и закрывается. Метод load (), соответственно, открывает поток как входной и читает данные из потока. При этом прежняя память возвращается, а данные из файла записываются в новый динамический массив.
Если нам нужна возможность ввода-вывода объектов в произвольный файл, то нужно передавать методам save()nload()B качестве параметра поток, связанный с этим файлом, например:
void save(ofstream &os); void load(ifstream &is);
В этом случае методы, естественно, упрощаются, так как никаких временных файлов не требуется, не нужно также открывать и закрывать поток. Класс ничего не знает о том, куда реально будет выведен объект, он только обеспечивает правильную сериализацию объекта. Аналогично метод чтения не знает, правильно ли установлена позиция чтения/записи в потоке — он просто выполняет чтение и конструирование объекта. Ответственность за правильное обращение с файлом возлагается на программу-клиента, использующую объекты данного класса.
Если вам понадобился впс для сайта, тогда посмотрите тут http://serverdale.com.
Можно пойти дальше, и реализовать независимую библиотеку сериализации. Одна из библиотек Boost так и называется библиотекой сериализации — Ser i а-lization . Это сложная профессиональная работа, в которой используются нетривиальные возможности шаблонов, RTTI и множественное наследование (см. главу 10). |