Detta inlägg redigerades senast av Summer den 16 09:31 2019
1. Vilket är det tekniska problemet som ska lösas i denna artikel?
Lös problemet i den tidigare tekniken att när man tolkar XML-dokument i C++-språket kan basklasstaggarna som förekommer i originaldokumentet endast tolka basklassdata enligt basklasstypen enligt den konventionella parsningsmetoden, men kan inte helt tolka den härledda klassdatan.
2. Teknisk bakgrund
I tidigare teknik, använd boost::serialization för att överföra härledda klasser med en basklasspekare eller använd BOOST_CLASS_EXPORT makro.
Båda ovanstående scheman i befintliga teknologier baseras på den abstrakta klassmekanismen, men eftersom abstrakta klasser inte kan instansieras som konkreta objekt som kan användas, kan objekt deklarerade som basklasser i XML-dokument inte parsas. Denna uppfinning syftar till att säkerställa att data från både basklassobjektet självt och det härledda klassobjektet som är markerat av basklassobjektet kan tolkas korrekt och bevaras helt.
3. Det tekniska schemat som ges i denna artikel
Denna artikel använder inte den abstrakta klassmekanismen, utan introducerar basklasspekaren i den klass som basklassen anropar, deklarerar basklassparsningsfunktionen som en virtuell funktion och anropar parsfunktionen genom basklasspekaren i parsningsprocessen, för att tillämpa polymorfism för att dynamiskt parsa och lagra data, och slutligen säkerställa att data från både basklassobjektet och det härledda klassobjektet härlett från basklassen kan lagras i basklassdefinierade pekaren. Specifika steg: Steg 1: C++-kod för att designa alla klasser som kan motsvara datataggarna i XML-dokumentet som ska tolkas, och analysera XML-data en efter en från toppnivåtaggarna. Steg 2: För varje taggparsed, avgör om det finns andra taggar som ärver taggen som basklass, det vill säga om taggtypen härleder andra taggtyper; Steg 3: Om det fastställs att den aktuella taggen inte ärvs som basklass, analysera den aktuella taggen enligt de normala parsningsstegen. Steg 4: Om det fastställs att den aktuella taggen ärvs som en basklass, avgör vidare om innehållet som beskrivs av basklasstaggen är underordnat basklassobjektet eller ett härlett klassobjekt; Steg 5: Om innehållet i den aktuella basklasstaggen bestäms för att beskriva basklassobjektet, analysera den aktuella taggen enligt normala steg. Steg 6: Om innehållet i den aktuella basklasstaggen beskriver det härledda klassobjektet, modifiera koden för att tolka enligt den nya parsingmetoden: ändra datastrukturen för den föregående typen som definierar basklassobjektet och definiera istället basklasspekaren; Modifiera basklassparsningsfunktionen och deklarera den som en virtuell funktion; Steg 7: Där basklassobjektet ursprungligen definierades för parsing, definieras basklasspekaren istället, och den specifika typen av minne tilldelas den enligt typen som beskrivs av etikettens innehåll, och basklasspekaren används för att anropa parsfunktionen för att tolka den aktuella etiketten. Steg 8: Analysera och spela den aktuella taggen för att avgöra om det fortfarande finns taggar att tolka; Steg 9: Om det fastställs att inga taggar ska tolkas betyder det att parsningen har slutförts och att datan har sparats i klassen med högst etikett i motsvarande XML-dokument i C++-klassen. Steg 10: Om det fastställs att det fortfarande finns taggar som inte har lösts, analysera nästa tagg enligt steg 2.
Bifogat flödesschema
4. Sammanfattning
C++ introducerar en basklasspekare för att tilldela objekt av motsvarande typ till XML-taggens innehåll beroende på om det är en basklass eller en härledd klass, och använder den definierade basklasspekaren för att anropa en parsningsfunktion deklarerad som en imaginär funktion för att tolka innehållet i XML-basklasstaggen. På detta sätt, när XML-basklasstaggen beskriver basklassobjektdata, kommer basklassparsningsfunktionen att anropas dynamiskt enligt polymorfismen av C++, och basklassdata som beskrivs av basklasstaggen kan parsas och bevaras korrekt. När XML-basklasstaggen beskriver data från den härledda klassobjektet, kommer den härledda klassparsingfunktionen att anropas dynamiskt enligt polymorfismen av C++, och de härledda klassdata som beskrivs av basklasstaggen kan också parsas och bevaras korrekt.
|