Feil kan ikke instantisere den abstrakte klassen

Feil kan ikke instantisere 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 gjenstander som er opprettet fra seg selv, er kjent som en abstrakt klasse. Det kalles også grensesnitt på C ++ språk. Enhver klasse kan gjøres abstrakt på C ++ språk 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 forelder eller baseklasse som alle andre barneklasser er avledet. Så for å få tilgang til den abstrakte klassen, må vi arve den fra baseklassene. Når vi prøver å instantisere en abstrakt klasse, får vi en kompilasjonsfeil.

Syntaks

Feilmeldingen til vår feil er som følger:

Feil: Kan ikke erklære variabelen "å være av abstrakt type"

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

Feil C2259: 'State': Kan ikke instantisere abstrakt klasse

Dette er en annen melding vi får fra kompilatoren når vi møter 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 erklært to andre funksjoner i tillegg til navnene "Setwidth" og "Setheight". Det vi vil gjøre her er at vi ønsker å få høyde som parameter og bredde som inngangsparameter. Vi beregner området ved hjelp av våre inngangsparametere. Vi opprettet en forekomst av klassen vår i hovedmetoden. Ved hjelp av det objektet har vi kalt metodene, og vi vil passere inngangsparametrene gjennom disse metodene. Etter det trykket vi utdataene våre for å sjekke resultatene.

#inkludere
ved hjelp av navneområdet STD;
Klasseform

offentlig:
virtuell int getArea () = 0;
ugyldig nedsatt (int w)

bredde = w;

void setheight (int h)

høyde = h;

beskyttet:
int bredde;
int høyde;
;
Int Main (Void)

Shapeclasssh;
sh.Setwidth (1);
sh.setheight (2);
cout<< "Total Rectangle area: " <retur 0;

Systemet ga oss en feil etter utførelsen 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 erklære dens variabel. Så med meldingen kan vi tydelig forstå at kompilatoren ikke lar oss instantisere 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 i vår abstrakte klasse, og vi vil erklære kroppen for vår virtuelle funksjon i denne klassen. Etter det vil vi lage dets objekt i hovedmetoden, og ved hjelp av objektet vil vi kalle funksjonene.

Etter endringene har vi laget koden vår, og vi har nå lyktes med å kjøre koden vår. Systemet har utført koden vår uten å gi feil. Vi kan se i utgangen at systemet har beregnet området til et rektangel og skrevet ut utgangen. Vi har lært at feilen vår var at vi direkte kalte formålet med vår abstrakte klasse som var feil tilnærming. Da vi ringte formålet med barneklassen begynte koden vår bra.

Eksempel # 02:

I dette eksemplet vil 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 vi utfører koden. I denne klassen har vi laget en abstrakt klasse og kalt den "AbSclass". Vi har erklært en annen klasse “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 hjelp av objekt" i en metode som er erklært i den abstrakte klassen. Navnet på funksjonen er "ValueFunc". Som vi diskuterte, er den virtuelle funksjonens kropp erklært i barneklassen. I vår barneklasse har vi skrevet ut "i virtuell funksjon" i vår virtuelle funksjonskropp. Nå vil vi gi en verdi til vår verdifunksjon og se om verdien nådd er riktig. I vår viktigste metode har vi laget en forekomst av vår abstrakte klasse, og med hjelp av forekomsten vil vi kalle våre virtuelle og andre funksjoner. Nå vil vi utføre koden vår.

#inkludere
ved hjelp av navneområdet STD;
klasse abslass

offentlig:
virtuell int virtfunc () = 0;
void ValueFunc (int w)

bredde = w;
cout<<"Value passed using Object"<
beskyttet:
int bredde;
;
Klassebarn:
Offentlig abslasse

offentlig:
int virtfunc ()
cout<<"In Virtual Function"<
;
Int Main (Void)

Childclass CC;
CC.ValueFunc (5);
cout<retur 0;

Etter utførelsen av koden vår, vil vi få en feil. Denne feilen er i utgangspunktet at vi ikke kan instantisere en abstrakt klasse som vi prøver å gjøre her i hovedmetoden vår. En ting å merke seg her er at variabel og abstrakt type i meldingen vår er endret.

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

Ved utførelse av koden vår har kompilatoren ikke kastet noen feil denne gangen. I stedet har systemet samlet koden vår med hell og gitt oss utgangen. La oss nå se på utdataene. Systemet har skrevet ut "verdien som er bestått ved hjelp av objekt" og "5" mot det. Fordi vi passerte 5 ved å bruke vår forekomst i hovedmetoden. Etter det trykket den linjen vi ba den til i vår virtuelle funksjon.

Konklusjon

I denne guiden diskuterte vi kritiske feilprogrammerere møte mens vi koder og praktiserer objektorienterte konsepter. Denne typen feil oppstår ofte når en programmerer har å gjøre med abstrakte klasser. Hele artikkelen oppsummerer at abstrakte klasser ikke kan instantieres, og vi kan ikke lage objektene deres til å ringe metoder i den. Vi prøvde også forskjellige eksempler for å lage feil og løste deretter feilene i koden vår.