Fejl: Kan ikke instansiere den abstrakte klasse

Fejl Kan Ikke Instansiere Den Abstrakte Klasse



Denne artikel handler om en anden fejl, der ofte opstår, når vi arbejder med abstrakte klasser i vores kode. Lad os studere konceptet med abstrakte klasser i objektorienteret programmering. En klasse, der ikke kan have nogen objekter skabt ud fra sig selv, er kendt som en abstrakt klasse. Det kaldes også interface i C++ Language. Enhver klasse kan gøres abstrakt i C++ sprog ved at erklære en ren virtuel funktion i den. For at erklære en virtuel funktion skal vi placere '=0' efter funktionen. Abstrakt klasse fungerer som en forældre- eller basisklasse, hvorfra alle de andre underordnede klasser er afledt. Så for at få adgang til den abstrakte klasse skal vi arve den fra dens basisklasser. Når vi forsøger at instansiere en abstrakt klasse, får vi en kompileringsfejl.

Syntaks

Fejlmeddelelsen for vores fejl er som følger:

fejl : kan ikke erklære variablen '' for at være af abstrakt type ''

Bemærk, at der i tom parentes vil være variable og abstrakte klassenavne.







fejl C2259 : 'Stat' : kan ikke instantiere abstrakt klasse

Dette er en anden besked, vi får fra compileren, når vi støder på en sådan fejl.



Eksempel #01:

For at gøre denne fejl forståelig, vil vi udføre et eksempel, hvor vi vil skrive vores kode på en sådan måde, at vi får en fejl. Til det formål har vi initialiseret en klasse med navnet 'ShapeClass'. For at gøre denne klasse abstrakt har vi erklæret en virtuel funktion i den med navnet 'getArea'. Vi har også erklæret to andre funktioner med navnene 'setWidth' og 'setHeight'. Det, vi vil gøre her, er, at vi ønsker at få Højde som parameter og bredde som inputparameter. Vi vil beregne arealet ved hjælp af vores inputparametre. Vi oprettede en forekomst af vores klasse i hovedmetoden. Ved hjælp af det objekt har vi kaldt metoderne, og vi vil sende inputparametrene gennem disse metoder. Derefter udskrev vi vores output for at kontrollere resultaterne.



#include

bruger navneområde std ;
klasse ShapeClass
{
offentlig :
virtuelle int Getaria ( ) = 0 ;
ugyldig sætBredde ( int i )
{
bredde = i ;
}
ugyldig sætHøjde ( int h )
{
højde = h ;
}
beskyttet :
int bredde ;
int højde ;
} ;
int vigtigste ( ugyldig )
{
ShapeClasssh ;
sh. sætBredde ( 1 ) ;
sh. sætHøjde ( to ) ;
cout << 'Samlet rektangelareal: ' << sh. Getaria ( ) << endl ;
Vend tilbage 0 ;
}

Systemet gav os en fejl efter udførelsen af ​​vores kode. Fejlmeddelelsen siger, at vi ikke kan erklære variabel 'sh' for at være af abstrakt type 'shapeclass'. Nu forsøger compileren at formidle, at 'ShapeClass' er en abstrakt type, og vi kan ikke erklære dens variabel. Så med beskeden kan vi tydeligt forstå, at compileren ikke lader os instansiere vores abstrakte klasse, det er grunden til, at systemet giver os fejlen.





For at løse fejlen erklærede vi en anden klasse 'Rektangel'. Denne klasse vil være børneklassen i vores abstrakte klasse, og vi vil erklære kroppen af ​​vores virtuelle funktion i denne klasse. Derefter vil vi oprette dets objekt i hovedmetoden, og ved hjælp af dets objekt kalder vi funktionerne.



Efter ændringerne lavede vi vores kode, og vi har nu haft succes med at køre vores kode. Systemet har udført vores kode uden at give fejl. Vi kan se i outputtet, at systemet har beregnet arealet af et rektangel og udskrevet outputtet. Vi har lært, at vores fejl var, at vi direkte kaldte objektet for vores abstrakte klasse, hvilket var den forkerte tilgang. Da vi kaldte objektet for dens underordnede klasse, begyndte vores kode at fungere fint.

Eksempel #02:

I dette eksempel vil vi ikke lave nogen matematiske beregninger. Dette eksempel er et generisk eksempel, der vil hjælpe os med at forstå abstrakte klasser, og hvordan compileren kører mellem metoderne og klasserne, mens koden udføres. I denne klasse har vi lavet en abstrakt klasse og kaldt den 'AbsClass'. Vi har erklæret en anden klasse 'ChildClass', men denne er ikke en abstrakt klasse. Denne klasse er afledt af vores abstrakte klasse.

Vi har udskrevet 'Værdi bestået ved hjælp af objekt' i en metode, der er erklæret i abstraktklassen. Navnet på funktionen er 'valueFunc'. Som vi diskuterede, er den virtuelle funktions krop erklæret i børneklassen. I vores børneklasse har vi printet 'I virtuel funktion' i vores virtuelle funktionslegeme. Nu vil vi sende en værdi til vores værdifunktion og se, om den nåede værdi er korrekt. I vores hovedmetode har vi lavet en instans af vores abstrakte klasse og ved hjælp af instansen vil vi kalde vores virtuelle og andre funktioner. Nu vil vi udføre vores kode.

#include

bruger navneområde std ;
klasse AbsClass
{
offentlig :
virtuelle int VirtFunc ( ) = 0 ;
ugyldig værdiFunc ( int i )
{
bredde = i ;
cout << 'Værdi overført ved hjælp af objekt' << i << endl ;
}
beskyttet :
int bredde ;
} ;
klasse Barneklasse :
offentlig AbsClass
{
offentlig :
int VirtFunc ( ) {
cout << 'I virtuel funktion' << endl ;
}
} ;
int vigtigste ( ugyldig )
{
ChildClass cc ;
cc. værdiFunc ( 5 ) ;
cout << cc. VirtFunc ( ) << endl ;
Vend tilbage 0 ;
}

Efter eksekvering af vores kode får vi en fejl. Denne fejl er grundlæggende, at vi ikke kan instantiere en abstrakt klasse, som vi forsøger at gøre her i vores hovedmetode. En ting at bemærke her er, at den variable og abstrakte type i vores besked er blevet ændret.

Nu vil vi prøve at fjerne vores fejl og udføre vores kode. Til det formål vil vi skabe genstanden for vores børneklasse og lave dens instans. Ved hjælp af denne instans vil vi kalde både den virtuelle og en anden metode i vores abstrakte klasse. Det vil også blive observeret, om vi kan få adgang til den virtuelle funktion ved hjælp af børneklassen eller ej. Hvis vi har succes med at gøre det, kan vi sige, at vi har fået adgang til den abstrakte klasse ved hjælp af dens afledte klasse.

Ved udførelse af vores kode har compileren ikke kastet nogen fejl denne gang. I stedet har systemet kompileret vores kode med succes og givet os outputtet. Lad os nu se på outputtet. Systemet har udskrevet 'Værdi overført ved hjælp af objekt' og '5' mod det. Fordi vi bestod 5 ved at bruge vores instans i hovedmetoden. Derefter udskrev den den linje, vi bad den om i vores virtuelle funktion.

Konklusion

I denne vejledning diskuterede vi kritiske fejl, som programmører støder på, mens de koder og praktiserer objektorienterede koncepter. Disse typer fejl opstår ofte, når en programmør beskæftiger sig med abstrakte klasser. Hele artiklen opsummerer, at abstrakte klasser ikke kan instansieres, og vi kan ikke få deres objekter til at kalde metoder i den. Vi prøvede også forskellige eksempler for at skabe fejl og løste derefter fejlene i vores kode.