Šį pranešimą paskutinį kartą redagavo Vasara 2019-1-16 09:31
1. Kokią techninę problemą reikia išspręsti šiame straipsnyje?
Išspręskite ankstesnės technikos problemą, kad analizuojant XML dokumentus C++ kalba, bazinės klasės žymės išvestiniai klasės duomenys, kurie rodomi originaliame XML dokumente, gali analizuoti tik pagrindinės klasės duomenis pagal bazinės klasės tipą pagal įprastą analizės metodą, bet negali visiškai išanalizuoti išvestinių klasės duomenų.
2. Techninės aplinkybės
Ankstesnėje technikoje naudokite boost::serialization, kad perkeltumėte išvestines klases su bazinės klasės žymekliu arba naudokite BOOST_CLASS_EXPORT makrokomandą.
Abi aukščiau išvardytos esamų technologijų schemos yra pagrįstos abstrakčių klasių mechanizmu, tačiau kadangi abstrakčios klasės negali būti instanciuojamos kaip konkretūs objektai, kuriuos galima naudoti, objektai, deklaruojami kaip bazinės klasės XML dokumentuose, negali būti analizuojami. Šis išradimas skirtas užtikrinti, kad tiek bazinės klasės objekto duomenys, tiek išvestinės klasės objektas, pažymėtas bazinės klasės objektu, galėtų būti teisingai išanalizuoti ir visiškai išsaugoti.
3. Šiame straipsnyje numatyta techninė schema
Šis straipsnis nenaudoja abstrakčios klasės mechanizmo, bet įveda bazinės klasės rodyklę į klasę, kurią iškviečia bazinė klasė, deklaruoja bazinės klasės analizės funkciją kaip virtualią funkciją ir iškviečia analizės funkciją per bazinės klasės rodyklę analizės procese, kad būtų taikomas polimorfizmas dinamiškai analizuoti ir saugoti duomenis, ir galiausiai užtikrina, kad tiek bazinės klasės objekto, tiek išvestinio klasės objekto, gauto iš bazinės klasės, duomenys gali būti saugomi bazinės klasės apibrėžtame rodyklėje. Konkretūs veiksmai: 1 veiksmas: C++ kodas, kad sukurtumėte visas klases, kurios gali atitikti analizuojamo XML dokumento duomenų žymas, ir išanalizuokite XML duomenis po vieną iš aukščiausio lygio žymų. 2 veiksmas: kiekvienai išanalizuotai žymai nustatykite, ar yra kitų žymų, kurios paveldi žymą kaip pagrindinę klasę, t. y. ar žymos tipas išveda kitus žymų tipus; Žingsnis 3: Jei nustatoma, kad dabartinė žyma nėra paveldima kaip pagrindinė klasė, išanalizuokite dabartinę žymą pagal įprastus analizės veiksmus. 4 žingsnis: Jei nustatoma, kad dabartinė žyma yra paveldima kaip bazinė klasė, toliau nustatykite, ar bazinės klasės žymos aprašytas turinys yra pavaldus bazinės klasės objektui, ar išvestiniam klasės objektui; 5 žingsnis: Jei dabartinės bazinės klasės žymos turinys apibūdinamas pagrindinės klasės objektui, išanalizuokite dabartinę žymą pagal įprastus veiksmus. 6 veiksmas: jei dabartinis pagrindinės klasės žymos turinys apibūdina išvestinės klasės objektą, pakeiskite kodą, kad jis būtų analizuojamas pagal naują analizės metodą: pakeiskite ankstesnio tipo, apibrėžiančio pagrindinės klasės objektą, duomenų struktūrą ir vietoj to apibrėžkite pagrindinės klasės žymeklį; Pakeiskite bazinės klasės analizės funkciją ir paskelbkite ją virtualia funkcija; Žingsnis 7: Kai pagrindinės klasės objektas iš pradžių buvo apibrėžtas analizei, vietoj jo apibrėžiamas pagrindinės klasės žymeklis ir jam priskiriamas konkretus atminties tipas pagal etiketės turinio aprašytą tipą, o pagrindinės klasės žymeklis naudojamas analizės funkcijai iškviesti, kad būtų išanalizuota dabartinė etiketė. 8 veiksmas: išanalizuokite ir paleiskite dabartinę žymą, kad nustatytumėte, ar vis dar yra analizuojamų žymų; Žingsnis 9: Jei nustatoma, kad nėra žymų, kurias reikia analizuoti, tai reiškia, kad analizė baigta ir duomenys išsaugoti klasėje su aukščiausia atitinkamo XML dokumento etikete C++ klasėje. Žingsnis 10: Jei nustatoma, kad vis dar yra žymų, kurios nebuvo išspręstos, išanalizuokite kitą žymą pagal 2 veiksmą.
Pridedama struktūrinė schema
4. Santrauka
C++ pristato bazinės klasės žymeklį, skirtą priskirti atitinkamo tipo objektus XML žymos turiniui pagal tai, ar tai yra pagrindinė klasė, ar išvestinė klasė, ir naudoja apibrėžtą bazinės klasės žymeklį, kad iškviestų analizės funkciją, paskelbtą kaip įsivaizduojamą funkciją, kad išanalizuotų XML bazinės klasės žymos turinį. Tokiu būdu, kai XML bazinės klasės žyma apibūdina bazinės klasės objekto duomenis, bazinės klasės analizės funkcija bus dinamiškai iškviečiama pagal C++ polimorfizmą, o bazinės klasės žymos aprašyti bazinės klasės duomenys gali būti teisingai išanalizuoti ir išsaugoti. Kai XML bazinės klasės žyma apibūdina išvestinius klasės objekto duomenis, išvestinės klasės analizės funkcija bus dinamiškai iškviečiama pagal C++ polimorfizmą, o išvestiniai klasės duomenys, aprašyti bazinės klasės žyma, taip pat gali būti teisingai išanalizuoti ir išsaugoti.
|