Dette innlegget ble sist redigert av Summer 16.019.2019 kl. 09:31
1. Hva er det tekniske problemet som skal løses i denne artikkelen?
Løs problemet i den tidligere teknikken at når man parser XML-dokumenter i C++-språket, kan baseklasse-taggene som vises i det opprinnelige XML-dokumentet bare parse baseklassedataene etter baseklassetypen i henhold til den konvensjonelle parsingmetoden, men kan ikke fullstendig analysere de avledede klassedataene.
2. Teknisk bakgrunn
I tidligere teknikk, bruk boost::serialization for å overføre avledede klasser med en baseklassepeker eller bruk BOOST_CLASS_EXPORT makro.
Begge de ovennevnte skjemaene i eksisterende teknologier er basert på den abstrakte klassemekanismen, men siden abstrakte klasser ikke kan instansieres som konkrete objekter som kan brukes, kan objekter deklarert som basisklasser i XML-dokumenter ikke parses. Denne oppfinnelsen er ment å sikre at dataene til både baseklasseobjektet selv og det avledede klasseobjektet merket av baseklasseobjektet kan parses korrekt og fullstendig bevares.
3. Det tekniske skjemaet som gis i denne artikkelen
Denne artikkelen bruker ikke den abstrakte klassemekanismen, men introduserer baseklassepekeren i klassen som kalles av baseklassen, erklærer basisklasseparsingsfunksjonen som en virtuell funksjon, og kaller parsingsfunksjonen gjennom baseklassepekeren i parsingsprosessen, slik at polymorfi dynamisk kan parse og lagre dataene, og til slutt sikrer at dataene til både baseklasseobjektet og det avledede klasseobjektet som er avledet fra baseklassen kan lagres i den baseklassedefinerte pekeren. Spesifikke trinn: Trinn 1: C++-kode for å designe alle klasser som kan tilsvare datataggene i XML-dokumentet som skal parses, og parse XML-data én etter én fra toppnivåtaggene. Trinn 2: For hver tag-parsed, avgjør om det finnes andre tagger som arver taggen som en baseklasse, det vil si om tag-typen stammer fra andre tag-typer; Trinn 3: Hvis det fastslås at den nåværende taggen ikke arves som en basisklasse, analyser den nåværende taggen i henhold til de normale parsingstegene. Trinn 4: Hvis det fastslås at den nåværende taggen arves som en baseklasse, skal videre avgjøres om innholdet beskrevet av baseklassetaggen er underordnet baseklasseobjektet eller et avledet klasseobjekt; Trinn 5: Hvis innholdet i den nåværende baseklassetaggen bestemmes for å beskrive baseklasseobjektet, analyser den nåværende taggen i henhold til de normale stegene. Trinn 6: Hvis innholdet i den nåværende baseklassetaggen beskriver det avledede klasseobjektet, modifiser koden til å parse i henhold til den nye parsingmetoden: endre datastrukturen til den forrige typen som definerer baseklasseobjektet og definer baseklassepekeren i stedet; Modifiser basisklasse-parsingsfunksjonen og erklærer den som en virtuell funksjon; Trinn 7: Der baseklasseobjektet opprinnelig ble definert for parsing, defineres baseklassepekeren i stedet, og den spesifikke typen minne tildeles den i henhold til typen beskrevet av etikettinnholdet, og baseklassepekeren brukes til å kalle parsingsfunksjonen for å parse den nåværende etiketten. Trinn 8: Analyser og spill den nåværende taggen for å finne ut om det fortsatt er tagger som skal analyseres; Trinn 9: Hvis det fastslås at det ikke finnes noen tagger som skal analyseres, betyr det at parsingen er fullført og dataene er lagret i klassen med høyest etikett i det tilsvarende XML-dokumentet i C++-klassen. Trinn 10: Hvis det fastslås at det fortsatt er tagger som ikke er løst, parse neste tagg i henhold til steg 2.
Flytskjema vedlagt
4. Sammendrag
C++ introduserer en baseklassepeker for å tildele objekter av tilsvarende type til XML-taginnholdet avhengig av om det er en baseklasse eller en avledet klasse, og bruker den definerte baseklassepekeren til å kalle en parsingfunksjon deklarert som en imaginær funksjon for å parse innholdet i XML-baseklassen. På denne måten, når XML-baseklassetaggen beskriver baseklasseobjektdataene, vil baseklasseparsing-funksjonen bli dynamisk kalt i henhold til polymorfismen til C++, og baseklassedataene beskrevet av baseklassetaggen kan parses og bevares korrekt. Når XML-baseklassetaggen beskriver de avledede klasseobjektdataene, vil den avledede klasseparsingsfunksjonen bli dynamisk kalt i henhold til polymorfismen til C++, og de avledede klassedataene beskrevet av baseklassetaggen kan også parses og bevares korrekt.
|