Цей допис востаннє відредаговано Summer 16.01.2019 09:31
1. Яку технічну проблему слід розв'язати в цій статті?
Розв'яжіть проблему попереднього рівня техніки, що при парсингу XML-документів мовою C++ базові теги класів із похідних даних класів, які з'являються в оригінальному XML-документі, можуть розбирати базові дані класу лише відповідно до типу базового класу згідно з традиційним методом розбору, але не можуть повністю розбирати похідні класові дані.
2. Технічний фон
У попередньому рівнях техніки використовуйте boost::serialization для передачі похідних класів за допомогою базового вказівника класу або використовуйте BOOST_CLASS_EXPORT макрос.
Обидві вищезгадані схеми в існуючих технологіях базуються на механізмі абстрактного класу, але оскільки абстрактні класи не можуть бути втілені як конкретні об'єкти, які можна використовувати, об'єкти, оголошені як базові класи в XML-документах, не можуть бути проаналізовані. Цей винахід покликаний забезпечити правильний аналіз і повне збереження даних як об'єкта базового класу, так і похідного об'єкта класу, позначеного об'єктом базового класу.
3. Технічна схема, наведена в цій статті
У цій статті не використовується механізм абстрактного класу, але вводиться базовий вказівник класу в клас, викликаний базовим класом, оголошує функцію розбору базового класу віртуальною функцією та викликає функцію парсингу через базовий вказівник класу в процесі розбору, щоб застосувати поліморфізм для динамічного розбору та зберігання даних, і нарешті гарантує, що дані як об'єкта базового класу, так і похідного класу, отриманого з базового класу, можуть зберігатися у вказівнику, визначеному базовим класом. Конкретні кроки: Крок 1: Кодування на C++ для проектування всіх класів, які можуть відповідати тегам даних у XML-документі, що підлягають розбору, і розбору XML-даних один за одним із верхніх тегів. Крок 2: Для кожного розбираного тегу визначте, чи є інші теги, які успадковують тег як базовий клас, тобто чи походить тип тегу з іншими типами тегів; Крок 3: Якщо встановлено, що поточний тег не успадковується як базовий клас, розберіть поточний тег відповідно до звичайних кроків розбору. Крок 4: Якщо визначено, що поточний тег успадковується як базовий клас, додатково визначте, чи є вміст, описаний тегом базового класу, підпорядкованим об'єкту базового класу, чи похідному класовому об'єкту; Крок 5: Якщо вміст поточного базового класу визначено для опису об'єкта базового класу, розберіть поточний тег відповідно до звичайних кроків. Крок 6: Якщо поточний вміст тегу базового класу описує похідний об'єкт класу, модифікуйте код для розбору відповідно до нового методу розбору: модифікуйте структуру даних попереднього типу, що визначає об'єкт базового класу, і визначте вказівник базового класу; Модифікувати функцію парсингу базового класу та оголосити її віртуальною функцією; Крок 7: Якщо об'єкт базового класу спочатку був визначений для розбору, замість нього визначається базовий вказівник класу, і йому виділяється конкретний тип пам'яті відповідно до типу, описаного вмістом мітки, а базовий вказівник класу використовується для виклику функції парсингу для розбору поточної мітки. Крок 8: Розберіть і відтворіть поточний тег, щоб визначити, чи залишилися теги для розбору; Крок 9: Якщо встановлено, що тегів для аналізу немає, це означає, що парсинг завершено, а дані збережені у класі з найвищою міткою відповідного XML-документа класу C++. Крок 10: Якщо встановлено, що ще є теги, які не були вирішені, розберіть наступний тег відповідно до кроку 2.
Прикріплена блок-схема
4. Підсумок
C++ вводить вказівник базового класу для призначення об'єктів відповідного типу вмісту тегу XML залежно від того, чи є він базовим чи похідним класом, і використовує визначений вказівник базового класу для виклику функції розбору, оголошеної як уявна функція, для розбору вмісту тегу базового класу XML. Таким чином, коли тег базового класу XML описує дані об'єкта базового класу, функція розбору базового класу буде динамічно викликатися відповідно до поліморфізму C++, а базові дані класу, описані тегом базового класу, можна правильно проаналізувати та зберегти. Коли базовий тег класу XML описує похідні дані об'єкта класу, похідна функція розбору класу динамічно викликається відповідно до поліморфізму C++, а похідні дані класу, описані базовим тегом класу, також можуть бути коректно проаналізовані та збережені.
|