Chyba: Nie je možné vytvoriť inštanciu abstraktnej triedy

Chyba Nie Je Mozne Vytvorit Instanciu Abstraktnej Triedy



Tento článok je o ďalšej chybe, ktorá sa často vyskytuje, keď pracujeme s abstraktnými triedami v našom kóde. Pozrime sa na koncept abstraktných tried v objektovo orientovanom programovaní. Trieda, ktorá nemôže mať zo seba vytvorené žiadne objekty, je známa ako abstraktná trieda. V jazyku C++ sa nazýva aj rozhranie. Každá trieda môže byť abstraktná v jazyku C++ deklarovaním čistej virtuálnej funkcie. Ak chcete deklarovať virtuálnu funkciu, musíme za funkciu umiestniť „=0“. Abstraktná trieda funguje ako nadradená alebo základná trieda, z ktorej sú odvodené všetky ostatné podradené triedy. Aby sme získali prístup k abstraktnej triede, musíme ju zdediť z jej základných tried. Keď sa pokúsime vytvoriť inštanciu abstraktnej triedy, dostaneme chybu pri kompilácii.

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.

#include

pomocou 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.