Questo post è stato modificato l'ultima volta da Summer il 16-1-2019 alle 09:31
1. Qual è il problema tecnico da risolvere in questo articolo?
Risolvere il problema della precedente arte secondo cui, durante l'analisi di documenti XML in linguaggio C++, i tag della classe base derivanti dai dati di classe che appaiono nel documento XML originale possono solo analizzare i dati della classe base secondo il tipo di classe base secondo il metodo di analisi convenzionale, ma non possono parzizzare completamente i dati di classe derivati.
2. Contesto tecnico
Nell'arte precedente, si usa boost::serializzazione per trasferire classi derivate con un puntatore di classe base o usa BOOST_CLASS_EXPORT macro.
Entrambi gli schemi sopra descritti nelle tecnologie esistenti si basano sul meccanismo delle classi astratte, ma poiché le classi astratte non possono essere istanziate come oggetti concreti utilizzabili, gli oggetti dichiarati come classi base nei documenti XML non possono essere analizzati. La presente invenzione è volta a garantire che i dati sia dell'oggetto di classe base stesso sia dell'oggetto di classe derivato segnato dall'oggetto di classe base possano essere correttamente analizzati e completamente preservati.
3. Lo schema tecnico fornito in questo articolo
Questo articolo non utilizza il meccanismo delle classi astratte, ma introduce il puntatore della classe base nella classe chiamata dalla classe base, dichiara la funzione di analisi della classe base come una funzione virtuale e chiama la funzione analizzante tramite il puntatore della classe base nel processo di analisi, in modo da applicare il polimorfismo per analizzare e memorizzare dinamicamente i dati, e infine garantisce che i dati sia dell'oggetto della classe base sia dell'oggetto di classe derivato possano essere memorizzati nel puntatore definito dalla classe base. Passaggi specifici: Passo 1: Codice C++ per progettare tutte le classi che possono corrispondere ai tag dati nel documento XML da analizzare, e analizzare i dati XML uno per uno dai tag di livello superiore. Passo 2: Per ogni tag analizzato, determinare se ci sono altri tag che ereditano il tag come classe base, cioè se il tipo di tag deriva altri tipi di tag; Passo 3: Se si determina che il tag corrente non è ereditato come classe base, analizza il tag corrente secondo i normali passaggi di parsing. Passo 4: Se si determina che il tag corrente è ereditato come classe base, si determina inoltre se il contenuto descritto dal tag di classe base è subordinato all'oggetto di classe base o a un oggetto di classe derivato; Passo 5: Se il contenuto del tag di classe base corrente è determinato a descrivere l'oggetto di classe base, analizza il tag corrente secondo i passaggi normali. Passo 6: Se il contenuto attuale del tag della classe base descrive l'oggetto di classe derivato, modificare il codice per analizzarlo secondo il nuovo metodo di parsing: modificare la struttura dati del tipo precedente che definisce l'oggetto di classe base e definire invece il puntatore della classe base; Modificare la funzione di analisi della classe base e dichiararla come funzione virtuale; Passo 7: Dove l'oggetto di classe base era originariamente definito per l'analisi analizzabile, viene definito invece il puntatore della classe base, e il tipo specifico di memoria viene allocato secondo il tipo descritto dal contenuto dell'etichetta, e il puntatore della classe base viene usato per chiamare la funzione di analisi e parizzare l'etichetta corrente. Passo 8: Analizza e riproduce il tag corrente per determinare se ci sono ancora tag da analizzare; Passo 9: Se si determina che non ci sono tag da analizzare, significa che l'analisi è stata completata e i dati sono stati salvati nella classe con l'etichetta più alta del corrispondente documento XML nella classe C++. Passo 10: Se si determina che ci sono ancora tag non risolti, analizza il tag successivo secondo il passo 2.
Diagramma di flusso allegato
4. Sommario
C++ introduce un puntatore di classe base per assegnare oggetti del tipo corrispondente al contenuto del tag XML in base al fatto che sia una classe base o una classe derivata, e utilizza il puntatore di classe base definito per chiamare una funzione di analisi dichiarata come funzione immaginaria per analizzare il contenuto del tag della classe base XML. In questo modo, quando il tag di classe base XML descrive i dati dell'oggetto di classe base, la funzione di analisi della classe base sarà chiamata dinamicamente secondo il polimorfismo di C++, e i dati della classe base descritti dal tag della classe base possono essere correttamente analizzati e preservati. Quando il tag di classe base XML descrive i dati derivati dell'oggetto di classe, la funzione di analisi delle classi derivate sarà chiamata dinamicamente secondo il polimorfismo di C++, e i dati di classe derivati descritti dal tag di classe base possono anch'essi essere correttamente analizzati e preservati.
|