Feil: Kan ikke instansiere den abstrakte klassen

Feil Kan Ikke Instansiere Den Abstrakte Klassen



Denne artikkelen handler om en annen feil som ofte oppstår når vi jobber med abstrakte klasser i koden vår. La oss studere konseptet med abstrakte klasser i objektorientert programmering. En klasse som ikke kan ha noen objekter opprettet fra seg selv er kjent som en abstrakt klasse. Det kalles også grensesnitt i C++ Language. Enhver klasse kan gjøres abstrakt i C++ Language ved å erklære en ren virtuell funksjon i den. For å erklære en virtuell funksjon, må vi plassere '=0' etter funksjonen. Abstrakt klasse fungerer som en overordnet eller basisklasse som alle de andre barneklassene er avledet fra. Så for å få tilgang til den abstrakte klassen, må vi arve den fra basisklassene. Når vi prøver å instansiere en abstrakt klasse, får vi en kompileringsfeil.

Syntaks

Feilmeldingen for feilen vår er som følger:

feil : kan ikke erklære at variabelen '' er av abstrakt type ''

Merk at i tom parentes vil det være variable og abstrakte klassenavn.







feil C2259 : 'Stat' : kan ikke instansiere abstrakt klasse

Dette er en annen melding vi får fra kompilatoren når vi støter på en slik feil.



Eksempel # 01:

For å gjøre denne feilen forståelig, vil vi utføre et eksempel der vi vil skrive koden vår på en slik måte at vi får en feil. For det formålet har vi initialisert en klasse med navnet 'ShapeClass'. For å gjøre denne klassen abstrakt, har vi erklært en virtuell funksjon i den med navnet 'getArea'. Vi har også erklært to andre funksjoner med navnene 'setWidth' og 'setHeight' henholdsvis. Det vi ønsker å gjøre her er at vi ønsker å få Høyde som parameter og bredde som inngangsparameter. Vi skal beregne arealet ved hjelp av våre inputparametere. Vi opprettet en forekomst av klassen vår i hovedmetoden. Ved hjelp av det objektet har vi kalt metodene, og vi vil sende inndataparametrene gjennom disse metodene. Etter det skrev vi ut utskriftene våre for å sjekke resultatene.



#include

bruker navneområde std ;
klasse ShapeClass
{
offentlig :
virtuell int Getaria ( ) = 0 ;
tomrom setWidth ( int i )
{
bredde = i ;
}
tomrom settHøyde ( int h )
{
høyde = h ;
}
beskyttet :
int bredde ;
int høyde ;
} ;
int hoved- ( tomrom )
{
ShapeClasssh ;
sh. setWidth ( 1 ) ;
sh. settHøyde ( to ) ;
cout << 'Totalt rektangelareal: ' << sh. Getaria ( ) << endl ;
komme tilbake 0 ;
}

Systemet ga oss en feil etter utførelse av koden vår. Feilmeldingen sier at vi ikke kan erklære variabel 'sh' for å være av abstrakt type 'shapeclass'. Nå prøver kompilatoren å formidle at 'ShapeClass' er en abstrakt type, og vi kan ikke deklarere variabelen. Så med meldingen kan vi tydelig forstå at kompilatoren ikke lar oss instansiere vår abstrakte klasse, det er grunnen til at systemet gir oss feilen.





For å løse feilen erklærte vi en annen klasse 'Rektangel'. Denne klassen vil være barneklassen til den abstrakte klassen vår, og vi vil erklære kroppen til vår virtuelle funksjon i denne klassen. Etter det vil vi lage objektet i hovedmetoden, og ved hjelp av objektet vil vi kalle funksjonene.



Etter endringene laget vi koden vår, og vi har nå klart å kjøre koden vår. Systemet har kjørt koden vår uten å gi feil. Vi kan se i utgangen at systemet har beregnet arealet til et rektangel og skrevet ut resultatet. Vi har lært at feilen vår var at vi direkte ringte objektet til vår abstrakte klasse, noe som var feil tilnærming. Da vi ringte objektet til barneklassen, begynte koden vår å fungere fint.

Eksempel #02:

I dette eksemplet skal vi ikke gjøre noen matematiske beregninger. Dette eksemplet er et generisk eksempel som vil hjelpe oss å forstå abstrakte klasser og hvordan kompilatoren kjører mellom metodene og klassene mens koden kjøres. I denne klassen har vi laget en abstrakt klasse og kalt den 'AbsClass'. Vi har erklært en annen klasse som 'ChildClass', men denne er ikke en abstrakt klasse. Denne klassen er avledet fra vår abstrakte klasse.

Vi har skrevet ut 'Verdi bestått ved bruk av objekt' i en metode som er deklarert i abstraktklassen. Navnet på funksjonen er 'valueFunc'. Som vi diskuterte, er den virtuelle funksjonens kropp erklært i barneklassen. I barneklassen vår har vi skrevet ut 'I virtuell funksjon' i vår virtuelle funksjonskropp. Nå vil vi sende en verdi til verdifunksjonen vår og se om verdien som nås er riktig. I hovedmetoden vår har vi laget en instans av vår abstrakte klasse og ved hjelp av instansen vil vi kalle våre virtuelle og andre funksjoner. Nå skal vi kjøre koden vår.

#include

bruker navneområde std ;
klasse AbsKlasse
{
offentlig :
virtuell int VirtFunc ( ) = 0 ;
tomrom verdiFunk ( int i )
{
bredde = i ;
cout << 'Verdi sendt ved bruk av objekt' << i << endl ;
}
beskyttet :
int bredde ;
} ;
klasse Barneklasse :
offentlig AbsClass
{
offentlig :
int VirtFunc ( ) {
cout << 'I virtuell funksjon' << endl ;
}
} ;
int hoved- ( tomrom )
{
ChildClass cc ;
cc. verdiFunk ( 5 ) ;
cout << cc. VirtFunc ( ) << endl ;
komme tilbake 0 ;
}

Etter utførelse av koden vår får vi en feilmelding. Denne feilen er i utgangspunktet at vi ikke kan instansiere en abstrakt klasse som vi prøver å gjøre her i hovedmetoden vår. En ting å merke seg her er at variabelen og abstrakttypen i meldingen vår er endret.

Nå vil vi prøve å fjerne feilen vår og kjøre koden vår. For det formålet vil vi lage objektet for barneklassen vår og lage dens forekomst. Ved hjelp av den forekomsten vil vi kalle både den virtuelle og en annen metode i abstraktklassen vår. Det vil også bli observert om vi kan få tilgang til den virtuelle funksjonen ved å bruke barneklassen eller ikke. Hvis vi lykkes med å gjøre det, kan vi si at vi har fått tilgang til den abstrakte klassen ved å bruke dens avledede klasse.

Ved utførelse av koden vår har ikke kompilatoren gitt noen feil denne gangen. I stedet har systemet kompilert koden vår og gitt oss utdataene. La oss nå se på utgangen. Systemet har skrevet ut 'Verdi passert med objekt' og '5' mot seg. Fordi vi passerte 5 ved å bruke instansen vår i hovedmetoden. Etter det skrev den ut linjen vi ba den om i vår virtuelle funksjon.

Konklusjon

I denne veiledningen diskuterte vi kritiske feil programmerere støter på mens de koder og praktiserer objektorienterte konsepter. Denne typen feil oppstår ofte når en programmerer arbeider med abstrakte klasser. Hele artikkelen oppsummerer at abstrakte klasser ikke kan instansieres, og vi kan ikke få objektene deres til å kalle metoder i den. Vi prøvde også forskjellige eksempler for å lage feil og løste deretter feilene i koden vår.