Viga: abstraktset klassi ei saa eksemplari luua

Viga Abstraktset Klassi Ei Saa Eksemplari Luua



See artikkel räägib teisest veast, mis sageli ilmneb, kui töötame oma koodis abstraktsete klassidega. Uurime abstraktsete klasside mõistet objektorienteeritud programmeerimises. Klassi, millel ei saa olla iseendast loodud objekte, nimetatakse abstraktseks klassiks. Seda nimetatakse C++ keeles ka liideseks. Iga klassi saab C++ keeles abstraktseks muuta, deklareerides selles puhta virtuaalse funktsiooni. Virtuaalse funktsiooni deklareerimiseks peame funktsiooni järele asetama “=0”. Abstraktne klass toimib ülem- või põhiklassina, millest tuletatakse kõik muud alamklassid. Seega peame abstraktsele klassile juurdepääsuks pärima selle põhiklassidest. Kui proovime abstraktset klassi instantseerida, saame kompileerimisvea.

Süntaks

Meie vea veateade on järgmine:

viga : ei saa deklareerida muutujat '' abstraktset tüüpi ''

Pange tähele, et tühjas sulgudes on muutujate ja abstraktsete klasside nimed.







viga C2259 : 'osariik' : ei saa abstraktset klassi instantseerida

See on veel üks sõnum, mille saame kompilaatorilt sellise vea ilmnemisel.



Näide # 01:

Selle vea arusaadavaks muutmiseks esitame näite, milles kirjutame oma koodi nii, et saame vea. Selleks oleme initsialiseerinud klassi nimega 'ShapeClass'. Selle klassi abstraktseks muutmiseks oleme selles deklareerinud virtuaalse funktsiooni nimega “getArea”. Oleme deklareerinud ka kaks muud funktsiooni vastavalt nimedega “setWidth” ja “setHeight”. Siin tahame saada parameetriks Kõrguse ja sisendparameetriks laiuse. Arvutame pindala meie sisendparameetrite abil. Lõime oma klassi eksemplari põhimeetodis. Selle objekti abil oleme meetodid kutsunud ja edastame sisendparameetrid nende meetodite kaudu. Pärast seda printisime tulemuste kontrollimiseks välja oma väljundi.



#include

kasutades nimeruumi std ;
klass ShapeClass
{
avalik :
virtuaalne int Getaria ( ) = 0 ;
tühine setWidth ( int sisse )
{
laius = sisse ;
}
tühine sea ​​Kõrgus ( int h )
{
kõrgus = h ;
}
kaitstud :
int laius ;
int kõrgus ;
} ;
int peamine ( tühine )
{
ShapeClasssh ;
sh. setWidth ( 1 ) ;
sh. sea ​​Kõrgus ( kaks ) ;
cout << 'Ristküliku kogupindala: ' << sh. Getaria ( ) << endl ;
tagasi 0 ;
}

Süsteem andis meile pärast koodi täitmist veateate. Veateade ütleb, et me ei saa deklareerida muutujat 'sh' abstraktset tüüpi 'shapeclass'. Nüüd üritab kompilaator anda mõista, et 'ShapeClass' on abstraktne tüüp ja me ei saa selle muutujat deklareerida. Seega saame sõnumiga selgelt aru, et kompilaator ei lase meil meie abstraktset klassi instantseerida, mistõttu süsteem annab meile vea.





Vea lahendamiseks kuulutasime teise klassi 'Ristkülik'. Sellest klassist saab meie abstraktse klassi alamklass ja me deklareerime selles klassis oma virtuaalse funktsiooni põhiosa. Pärast seda loome selle objekti põhimeetodis ja selle objekti abil kutsume välja funktsioonid.



Pärast muudatusi koostasime oma koodi ja oleme nüüd oma koodi käivitanud. Süsteem on meie koodi käivitanud ilma vigu andmata. Väljundis näeme, et süsteem on välja arvutanud ristküliku pindala ja printinud väljundi. Oleme õppinud, et meie viga oli see, et nimetasime oma abstraktse klassi objekti otse, mis oli vale lähenemine. Kui helistasime selle alamklassi objektile, hakkas meie kood hästi töötama.

Näide # 02:

Selles näites me matemaatilisi arvutusi ei tee. See näide on üldine näide, mis aitab meil mõista abstraktseid klasse ja seda, kuidas kompilaator koodi täitmisel meetodite ja klasside vahel töötab. Selles klassis oleme loonud abstraktse klassi ja andnud sellele nimeks 'AbsClass'. Oleme kuulutanud teise klassi 'ChildClass', kuid see ei ole abstraktne klass. See klass on tuletatud meie abstraktsest klassist.

Oleme trükkinud abstraktses klassis deklareeritud meetodil 'Väärtus, mis on edastatud objekti abil'. Funktsiooni nimi on 'valueFunc'. Nagu arutasime, deklareeritakse virtuaalse funktsiooni keha alamklassis. Oma lasteklassis oleme oma virtuaalfunktsiooni kehasse trükkinud “In Virtual function”. Nüüd edastame väärtuse oma väärtusfunktsioonile ja vaatame, kas saavutatud väärtus on õige. Meie põhimeetodis oleme loonud oma abstraktse klassi eksemplari ja eksemplari abil kutsume välja oma virtuaalsed ja muud funktsioonid. Nüüd käivitame oma koodi.

#include

kasutades nimeruumi std ;
klass AbsClass
{
avalik :
virtuaalne int VirtFunc ( ) = 0 ;
tühine valueFunc ( int sisse )
{
laius = sisse ;
cout << 'Objekti abil edastatud väärtus' << sisse << endl ;
}
kaitstud :
int laius ;
} ;
klass Lapseklass :
avalik AbsClass
{
avalik :
int VirtFunc ( ) {
cout << 'Virtuaalses funktsioonis' << endl ;
}
} ;
int peamine ( tühine )
{
ChildClass cc ;
cc. väärtusFunc ( 5 ) ;
cout << cc. VirtFunc ( ) << endl ;
tagasi 0 ;
}

Pärast koodi täitmist saame veateate. Põhimõtteliselt on see viga selles, et me ei saa abstraktset klassi, mida me siin oma põhimeetodis teha üritame, eksemplari luua. Üks asi, mida siinkohal märkida, on see, et meie sõnumi muutujat ja abstraktset tüüpi on muudetud.

Nüüd proovime oma vea eemaldada ja oma koodi käivitada. Selleks loome oma lapseklassi objekti ja teeme selle eksemplari. Selle eksemplari abil kutsume oma abstraktses klassis nii virtuaalset kui ka teist meetodit. Samuti jälgitakse, kas pääseme virtuaalsele funktsioonile juurde alamklassi abil või mitte. Kui see õnnestub, võime öelda, et oleme jõudnud abstraktsele klassile selle tuletatud klassi abil.

Meie koodi täitmisel pole kompilaator seekord ühtegi viga välja toonud. Selle asemel on süsteem meie koodi edukalt kompileerinud ja meile väljundi andnud. Nüüd vaatame väljundit. Süsteem on trükkinud vastu “Väärtus läbitud objekti abil” ja “5”. Kuna me läbisime 5, kasutades meie eksemplari põhimeetodis. Pärast seda printis see rea, mida sellel meie virtuaalses funktsioonis palusime.

Järeldus

Selles juhendis käsitlesime kriitilisi vigu, millega programmeerijad objektorienteeritud kontseptsioonide kodeerimisel ja harjutamisel kokku puutuvad. Seda tüüpi vead tekivad sageli siis, kui programmeerija tegeleb abstraktsete klassidega. Kogu artikkel võtab kokku, et abstraktseid klasse ei saa instantseerida ja me ei saa panna nende objekte selles meetodeid kutsuma. Proovisime ka erinevaid näiteid vigade loomiseks ja seejärel lahendasime vead oma koodis.