Последний раз этот пост был отредактирован Саммер 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++, а производные данные класса, описанные базовым тегом класса, также могут быть корректно проанализированы и сохранены.
|