Šo ziņu pēdējo reizi rediģēja Vasara 2019-1-16 09:31
1. Kāda ir tehniskā problēma, kas jārisina šajā rakstā?
Atrisināt problēmu agrākajā tehnikā, ka, parsējot XML dokumentus C++ valodā, bāzes klases tagi atvasinātie klases dati, kas parādās oriģinālajā XML dokumentā, var parsēt tikai bāzes klases datus atbilstoši bāzes klases tipam saskaņā ar parasto parsēšanas metodi, bet nevar pilnībā parsēt atvasinātos klases datus.
2. Tehniskais pamatojums
Iepriekšējā tehnikā izmantojiet boost::serialization, lai pārsūtītu atvasinātās klases ar pamatklases rādītāju vai BOOST_CLASS_EXPORT makro.
Abas iepriekš minētās shēmas esošajās tehnoloģijās ir balstītas uz abstraktu klases mehānismu, bet, tā kā abstraktās klases nevar instancēt kā konkrētus objektus, kurus var izmantot, objektus, kas XML dokumentos deklarēti kā bāzes klases, nevar parsēt. Šis izgudrojums ir paredzēts, lai nodrošinātu, ka gan paša bāzes klases objekta, gan atvasinātā klases objekta datus, kas atzīmēti ar bāzes klases objektu, var pareizi parsēt un pilnībā saglabāt.
3. Šajā pantā paredzētā tehniskā shēma
Šajā rakstā netiek izmantots abstraktās klases mehānisms, bet tiek ieviests bāzes klases rādītājs klasē, ko sauc bāzes klase, deklarē bāzes klases parsēšanas funkciju kā virtuālu funkciju un izsauc parsēšanas funkciju caur bāzes klases rādītāju parsēšanas procesā, lai piemērotu polimorfismu, lai dinamiski parsētu un saglabātu datus, un visbeidzot nodrošina, ka gan bāzes klases objekta, gan atvasinātā klases objekta datus var saglabāt bāzes klases definētajā rādītājā. Konkrēti soļi: 1. solis: C++ kods, lai noformētu visas klases, kas var atbilst parsējamā XML dokumenta datu tagiem, un parsēt XML datus pa vienam no augstākā līmeņa tagiem. 2. solis: katram parsētajam tagam nosakiet, vai ir citi tagi, kas manto tagu kā pamatklasi, tas ir, vai taga tips atvasina citus tagu tipus; 3. solis: Ja tiek noteikts, ka pašreizējais tags nav mantots kā pamatklase, parsējiet pašreizējo tagu saskaņā ar parastajām parsēšanas darbībām. 4. solis: Ja tiek noteikts, ka pašreizējais tags ir pārmantots kā bāzes klase, tālāk nosakiet, vai pamatklases taga aprakstītais saturs ir pakārtots pamatklases objektam vai atvasinātam klases objektam; Step 5: Ja pašreizējā bāzes klases taga saturs ir noteikts, lai aprakstītu bāzes klases objektu, parsējiet pašreizējo tagu saskaņā ar parastajām darbībām. 6. solis: Ja pašreizējais pamatklases taga saturs apraksta atvasināto klases objektu, modificējiet kodu, lai parsētu saskaņā ar jauno parsēšanas metodi: modificējiet iepriekšējā tipa datu struktūru, kas definē bāzes klases objektu, un tā vietā definējiet bāzes klases rādītāju; Modificējiet bāzes klases parsēšanas funkciju un pasludiniet to par virtuālu funkciju; 7. solis: Ja bāzes klases objekts sākotnēji tika definēts parsēšanai, tā vietā tiek definēts bāzes klases rādītājs, un tam tiek piešķirts konkrētais atmiņas veids atbilstoši etiķetes satura aprakstītajam tipam, un bāzes klases rādītājs tiek izmantots, lai izsauktu parsēšanas funkciju, lai parsētu pašreizējo etiķeti. 8. solis: Analizējiet un atskaņojiet pašreizējo tagu, lai noteiktu, vai joprojām ir jāparsē tagi; 9. solis: Ja tiek konstatēts, ka nav analizējamu tagu, tas nozīmē, ka parsēšana ir pabeigta un dati ir saglabāti klasē ar atbilstošā XML dokumenta augstāko etiķeti C++ klasē. 10. solis: Ja tiek konstatēts, ka joprojām ir atzīmes, kas nav atrisinātas, parsējiet nākamo tagu saskaņā ar 2. darbību.
Pievienota plūsmas diagramma
4. Kopsavilkums
C++ ievieš bāzes klases rādītāju, lai piešķirtu atbilstoša tipa objektus XML taga saturam atkarībā no tā, vai tā ir pamatklase vai atvasināta klase, un izmanto definēto bāzes klases rādītāju, lai izsauktu parsēšanas funkciju, kas deklarēta kā iedomāta funkcija, lai parsētu XML pamatklases taga saturu. Tādā veidā, kad XML bāzes klases tags apraksta bāzes klases objekta datus, bāzes klases parsēšanas funkcija tiks dinamiski izsaukta saskaņā ar C++ polimorfismu, un bāzes klases taga aprakstītos pamatklases datus var pareizi parsēt un saglabāt. Kad XML bāzes klases tags apraksta atvasinātos klases objekta datus, atvasinātās klases parsēšanas funkcija tiks dinamiski izsaukta atbilstoši C++ polimorfismam, un atvasinātos klases datus, kas aprakstīti ar pamatklases tagu, var arī pareizi parsēt un saglabāt.
|