Seda postitust toimetas viimati Summer 16.01.2019 kell 09:31
1. Milline on tehniline probleem, mida selles artiklis lahendatakse?
Lahenda probleem varasemas tehnikas, et kui parsida XML-dokumente C++ keeles, saavad baasklassi sildid tuletatud klassiandmeid, mis esinevad originaalses XML-dokumendis, ainult baasklassi andmeid vastavalt tavapärasele parsimismeetodile, kuid ei saa täielikult parsida tuletatud klassiandmeid.
2. Tehniline taust
Varasemas tehnikas kasuta boost::serialiseerimist, et ülekanda tuletatud klasse baasklassi osutiga või kasutada BOOST_CLASS_EXPORT makrot.
Mõlemad ülaltoodud skeemid olemasolevates tehnoloogiates põhinevad abstraktse klassi mehhanismil, kuid kuna abstraktseid klasse ei saa kasutada konkreetsete objektidena, ei saa XML-dokumentides baasklassidena deklareeritud objekte parseerida. Praegune leiutis on mõeldud tagama, et nii baasklassi objekti kui ka tuletatud klassiobjekti andmed oleksid õigesti parsitud ja täielikult säilitatud.
3. Selles artiklis esitatud tehniline skeem
See artikkel ei kasuta abstraktset klassi mehhanismi, vaid tutvustab baasklassi osutit baasklassi poolt kutsutud klassi, deklareerib baasklassi parsimisfunktsiooni virtuaalfunktsioonina ning kutsub parsimisfunktsiooni läbi baasklassi osuti parsimisprotsessis, et rakendada polümorfismi andmete dünaamiliseks parsimiseks ja salvestamiseks ning lõpuks tagab, et nii baasklassi objekti kui ka baasklassist tuletatud klassiobjekti andmed saab salvestada baasklassi defineeritud osutis. Konkreetsed sammud: 1. samm: C++ kood, et kujundada kõik klassid, mis võivad vastata parsitava XML-dokumendi andmesiltidele, ning parseerida XML-andmeid ükshaaval tipptaseme siltidest. 2. samm: Iga parsitud sildi puhul määrake, kas leidub teisi silte, mis pärivad sildi baasklassina, st kas siltitüüp tuletab teisi siltitüüpe; 3. samm: Kui on kindlaks tehtud, et praegune silt ei pärandata baasklassina, parseeri praegune silt vastavalt tavapärastele parsimissammudele. 4. samm: Kui selgub, et praegune silt pärandatakse baasklassina, tuleb edasi selgitada, kas baasklassi sildi kirjeldatud sisu on allutatud baasklassi objektile või tuletatud klassiobjektile; 5. samm: Kui praeguse baasklassi sildi sisu kirjeldab baasklassi objekti, parseeri praegune silt vastavalt tavapärastele sammudele. 6. samm: Kui praegune baasklassi sildi sisu kirjeldab tuletatud klassiobjekti, muuda koodi nii, et see parse'iks vastavalt uuele parsimismeetodile: muuda eelmise tüübi andmestruktuuri, mis määratleb baasklassi objekti, ja määra selle asemel baasklassi viide; Muuda baasklassi parsimisfunktsiooni ja deklareeri see virtuaalseks funktsiooniks; 7. samm: Kui algselt määratleti baasklassi objekt parsimiseks, määratletakse selle asemel baasklassi osut, millele määratakse spetsiifiline mälu tüüp vastavalt sildi sisus kirjeldatud tüübile, ning baasklassi osutit kasutatakse parsimisfunktsiooni kutsumiseks praeguse sildi parsimiseks. 8. samm: Parsi ja mängi praegune silt, et määrata, kas on veel silte, mida parsida; 9. samm: Kui selgub, et parsimiseks pole ühtegi silti, tähendab see, et parsimine on lõpetatud ja andmed salvestatud klassi, millel on kõrgeim silt vastavas XML-dokumendis C++ klassis. 10. samm: Kui selgub, et on veel silte, mida pole lahendatud, analüüsi järgmine silt vastavalt sammule 2.
Vooskeem lisatud
4. Kokkuvõte
C++ tutvustab baasklassi osutit, mis määrab vastava tüübi objektid XML-sildi sisule vastavalt sellele, kas see on baasklass või tuletatud klass, ning kasutab defineeritud baasklassi osutit, et kutsuda kujuteldava funktsioonina deklareeritud parsimisfunktsiooni XML baasklassi sildi sisu parsimiseks. Nii, kui XML baasklassi silt kirjeldab baasklassi objektiandmeid, kutsutakse baasklassi parsimisfunktsioon dünaamiliselt vastavalt C++ polümorfismile ning baasklassi sildi kirjeldatud baasklassi andmed saab õigesti parsida ja säilitada. Kui XML baasklassi silt kirjeldab tuletatud klassiobjekti andmeid, kutsutakse tuletatud klassi parsimisfunktsioon dünaamiliselt vastavalt C++ polümorfismile ning tuletatud klassiandmeid, mida kirjeldab baasklassi silt, saab samuti õigesti parsida ja säilitada.
|