Syntax
Chybové hlásenie našej chyby je nasledovné:
chyba : nemôže deklarovať premennú „ “ ako abstraktného typu „“Všimnite si, že v prázdnych zátvorkách budú názvy premenných a abstraktných tried.
chyba C2259 : 'Štát' : nemôže vytvoriť inštanciu abstraktnej triedy
Toto je ďalšia správa, ktorú dostaneme od kompilátora, keď narazíme na takúto chybu.
Príklad č. 01:
Aby bola táto chyba zrozumiteľná, uvedieme príklad, v ktorom napíšeme náš kód tak, aby sme dostali chybu. Na tento účel sme inicializovali triedu s názvom „ShapeClass“. Aby bola táto trieda abstraktná, deklarovali sme v nej virtuálnu funkciu s názvom „getArea“. Deklarovali sme aj dve ďalšie funkcie s názvami „setWidth“ a „setHeight“. Tu chceme urobiť to, že chceme získať výšku ako parameter a šírku ako vstupný parameter. Plochu vypočítame pomocou našich vstupných parametrov. V hlavnej metóde sme vytvorili inštanciu našej triedy. Pomocou tohto objektu sme zavolali metódy a cez tieto metódy prejdeme vstupné parametre. Potom sme vytlačili náš výstup, aby sme skontrolovali výsledky.
#include
pomocou menného priestoru std ;
trieda ShapeClass
{
verejnosti :
virtuálne int Getaria ( ) = 0 ;
neplatné setWidth ( int v )
{
šírka = v ;
}
neplatné setHeight ( int h )
{
výška = h ;
}
chránené :
int šírka ;
int výška ;
} ;
int hlavné ( neplatné )
{
ShapeClasssh ;
sh. setWidth ( 1 ) ;
sh. setHeight ( dva ) ;
cout << 'Celková plocha obdĺžnika: ' << sh. Getaria ( ) << endl ;
vrátiť 0 ;
}
Po vykonaní nášho kódu nám systém oznámil chybu. Chybové hlásenie hovorí, že nemôžeme deklarovať premennú „sh“ ako abstraktný typ „shapeclass“. Teraz sa kompilátor snaží vyjadriť, že „ShapeClass“ je abstraktný typ a nemôžeme deklarovať jeho premennú. Takže pomocou správy môžeme jasne pochopiť, že kompilátor nám nedovolí vytvoriť inštanciu našej abstraktnej triedy, a preto nám systém dáva chybu.
Aby sme chybu vyriešili, deklarovali sme inú triedu „Obdĺžnik“. Táto trieda bude podradenou triedou našej abstraktnej triedy a v tejto triede budeme deklarovať telo našej virtuálnej funkcie. Potom vytvoríme jeho objekt v metóde main a pomocou jeho objektu zavoláme funkcie.
Po úpravách sme vytvorili náš kód a teraz sme úspešní pri spustení nášho kódexu. Systém vykonal náš kód bez hlásenia chýb. Vo výstupe vidíme, že systém vypočítal plochu obdĺžnika a vytlačil výstup. Dozvedeli sme sa, že našou chybou bolo, že sme priamo volali objekt našej abstraktnej triedy, čo bol nesprávny prístup. Keď sme zavolali objekt jeho podradenej triedy, náš kód začal fungovať dobre.
Príklad č. 02:
V tomto príklade nebudeme robiť žiadne matematické výpočty. Tento príklad je všeobecným príkladom, ktorý nám pomôže pochopiť abstraktné triedy a spôsob, akým kompilátor beží medzi metódami a triedami pri vykonávaní kódu. V tejto triede sme vytvorili abstraktnú triedu a nazvali ju „AbsClass“. Vyhlásili sme ďalšiu triedu „ChildClass“, ale táto nie je abstraktná trieda. Táto trieda je odvodená od našej abstraktnej triedy.
Vytlačili sme „Hodnota odovzdaná pomocou objektu“ v metóde deklarovanej v abstraktnej triede. Názov funkcie je „valueFunc“. Ako sme diskutovali, telo virtuálnej funkcie je deklarované v detskej triede. V našej triede detí sme v tele virtuálnej funkcie vytlačili „Vo virtuálnej funkcii“. Teraz prenesieme hodnotu do našej hodnotovej funkcie a uvidíme, či je dosiahnutá hodnota správna. V našej hlavnej metóde sme vytvorili inštanciu našej abstraktnej triedy a pomocou inštancie budeme volať naše virtuálne a iné funkcie. Teraz spustíme náš kód.
#includepomocou menného priestoru std ;
trieda AbsClass
{
verejnosti :
virtuálne int VirtFunc ( ) = 0 ;
neplatné valueFunc ( int v )
{
šírka = v ;
cout << 'Hodnota odovzdaná pomocou objektu' << v << endl ;
}
chránené :
int šírka ;
} ;
trieda ChildClass :
verejné AbsClass
{
verejnosti :
int VirtFunc ( ) {
cout << 'Vo virtuálnej funkcii' << endl ;
}
} ;
int hlavné ( neplatné )
{
ChildClass cc ;
cc. valueFunc ( 5 ) ;
cout << cc. VirtFunc ( ) << endl ;
vrátiť 0 ;
}
Po vykonaní nášho kódu dostaneme chybu. Táto chyba je v podstate v tom, že nemôžeme vytvoriť inštanciu abstraktnej triedy, o ktorú sa tu pokúšame v našej hlavnej metóde. Jedna vec, ktorú treba poznamenať, je, že premenná a abstraktný typ v našej správe sa zmenili.
Teraz sa pokúsime odstrániť našu chybu a spustiť náš kód. Na tento účel vytvoríme objekt našej podradenej triedy a vytvoríme jeho inštanciu. S pomocou tejto inštancie zavoláme virtuálnu aj inú metódu v našej abstraktnej triede. Tiež sa bude sledovať, či môžeme pristupovať k virtuálnej funkcii pomocou detskej triedy alebo nie. Ak sa nám to podarí, môžeme povedať, že sme pristúpili k abstraktnej triede pomocou jej odvodenej triedy.
Po vykonaní nášho kódu kompilátor tentoraz nevyvolal žiadnu chybu. Namiesto toho systém úspešne skompiloval náš kód a poskytol nám výstup. Teraz sa pozrime na výstup. Systém proti nej vytlačil „Hodnota odovzdaná pomocou objektu“ a „5“. Pretože sme prešli 5 pomocou našej inštancie v hlavnej metóde. Potom vytlačil riadok, o ktorý sme ho požiadali v našej virtuálnej funkcii.
Záver
V tejto príručke sme diskutovali o kritických chybách, s ktorými sa programátori stretávajú pri kódovaní a precvičovaní objektovo orientovaných konceptov. Tieto typy chýb sa často vyskytujú, keď sa programátor zaoberá abstraktnými triedami. Celý článok sumarizuje, že abstraktné triedy nemožno vytvárať inštanciami a ich objekty v ňom nemôžeme prinútiť volať metódy. Vyskúšali sme tiež rôzne príklady na vytvorenie chýb a potom sme vyriešili chyby v našom kóde.