Pogreška: nije moguće instancirati apstraktnu klasu

Pogreska Nije Moguce Instancirati Apstraktnu Klasu



Ovaj članak govori o još jednoj pogrešci koja se često pojavljuje kada radimo s apstraktnim klasama u našem kodu. Proučimo koncept apstraktnih klasa u objektno orijentiranom programiranju. Klasa koja ne može imati objekte stvorene iz sebe poznata je kao apstraktna klasa. Naziva se i sučelje u jeziku C++. Bilo koja klasa može biti apstraktna u jeziku C++ deklariranjem čiste virtualne funkcije u njoj. Da bismo deklarirali virtualnu funkciju, moramo staviti “=0” iza funkcije. Apstraktna klasa djeluje kao nadređena ili osnovna klasa iz koje su izvedene sve druge podređene klase. Dakle, da bismo pristupili apstraktnoj klasi, moramo je naslijediti od njenih osnovnih klasa. Kada pokušamo instancirati apstraktnu klasu, dobivamo pogrešku kompilacije.

Sintaksa

Poruka pogreške naše pogreške je sljedeća:

greška : ne može deklarirati varijablu ' ' kao apstraktnog tipa ''

Imajte na umu da će u praznim zagradama biti imena varijabli i apstraktnih klasa.







pogreška C2259 : 'Država' : ne može instancirati apstraktnu klasu

Ovo je još jedna poruka koju dobivamo od kompilatora kada naiđemo na takvu grešku.



Primjer # 01:

Da bi ova pogreška bila razumljiva, izvest ćemo primjer u kojem ćemo naš kod napisati tako da dobijemo pogrešku. U tu svrhu smo inicijalizirali klasu pod nazivom “ShapeClass”. Kako bismo ovu klasu učinili apstraktnom, u njoj smo deklarirali virtualnu funkciju pod nazivom 'getArea'. Deklarirali smo i druge dvije funkcije s nazivima 'setWidth' i 'setHeight'. Ono što ovdje želimo učiniti je da želimo dobiti visinu kao parametar i širinu kao ulazni parametar. Izračunat ćemo površinu uz pomoć naših ulaznih parametara. Stvorili smo instancu naše klase u glavnoj metodi. Uz pomoć tog objekta pozvali smo metode i kroz te metode ćemo propuštati ulazne parametre. Nakon toga smo ispisali naš izlaz kako bismo provjerili rezultate.



#include

koristeći prostor imena std ;
klasa ShapeClass
{
javnost :
virtualan int Getarija ( ) = 0 ;
poništiti setWidth ( int u )
{
širina = u ;
}
poništiti setHeight ( int h )
{
visina = h ;
}
zaštićen :
int širina ;
int visina ;
} ;
int glavni ( poništiti )
{
ShapeClasssh ;
sh. setWidth ( 1 ) ;
sh. setHeight ( dva ) ;
cout << 'Ukupna površina pravokutnika: ' << sh. Getarija ( ) << endl ;
povratak 0 ;
}

Sustav nam je javio pogrešku nakon izvršenja našeg koda. Poruka o pogrešci kaže da ne možemo deklarirati varijablu 'sh' kao apstraktnu vrstu 'shapeclass'. Sada prevodilac pokušava prenijeti da je 'ShapeClass' apstraktni tip i da ne možemo deklarirati njegovu varijablu. Dakle, s porukom možemo jasno razumjeti da nam prevodilac ne dopušta da instanciramo našu apstraktnu klasu, zbog čega nam sustav daje pogrešku.





Kako bismo riješili pogrešku, deklarirali smo drugu klasu 'Pravokutnik'. Ova klasa će biti klasa dijete naše apstraktne klase i mi ćemo deklarirati tijelo naše virtualne funkcije u ovoj klasi. Nakon toga ćemo kreirati njegov objekt u glavnoj metodi i uz pomoć njegovog objekta pozivati ​​funkcije.



Nakon izmjena i dopuna izradili smo naš kod i sada uspješno izvodimo naš kod. Sustav je izvršio naš kod bez davanja pogrešaka. U izlazu možemo vidjeti da je sustav izračunao površinu pravokutnika i ispisao izlaz. Naučili smo da je naša pogreška bila što smo izravno pozivali objekt naše apstraktne klase, što je bio pogrešan pristup. Kada smo pozvali objekt njegove podređene klase, naš kod je počeo dobro raditi.

Primjer # 02:

U ovom primjeru nećemo raditi nikakve matematičke izračune. Ovaj primjer je generički primjer koji će nam pomoći da razumijemo apstraktne klase i kako prevodilac radi između metoda i klasa dok izvršava kod. U ovoj klasi stvorili smo apstraktnu klasu i nazvali je 'AbsClass'. Proglasili smo drugu klasu 'ChildClass', ali ova nije apstraktna klasa. Ova klasa je izvedena iz naše apstraktne klase.

Ispisali smo 'Vrijednost proslijeđenu pomoću objekta' u metodi deklariranoj u apstraktnoj klasi. Naziv funkcije je 'valueFunc'. Kao što smo spomenuli, tijelo virtualne funkcije je deklarirano u podređenoj klasi. U našoj dječjoj klasi ispisali smo 'U virtualnoj funkciji' u našem tijelu virtualne funkcije. Sada ćemo proslijediti vrijednost našoj funkciji vrijednosti i vidjeti je li postignuta vrijednost točna. U našoj glavnoj metodi stvorili smo instancu naše apstraktne klase i uz pomoć instance pozivat ćemo naše virtualne i druge funkcije. Sada ćemo izvršiti naš kod.

#include

koristeći prostor imena std ;
klasa AbsClass
{
javnost :
virtualan int VirtFunc ( ) = 0 ;
poništiti valueFunc ( int u )
{
širina = u ;
cout << 'Vrijednost proslijeđena pomoću objekta' << u << endl ;
}
zaštićen :
int širina ;
} ;
klasa ChildClass :
javni AbsClass
{
javnost :
int VirtFunc ( ) {
cout << 'U virtualnoj funkciji' << endl ;
}
} ;
int glavni ( poništiti )
{
ChildClass cc ;
cc. valueFunc ( 5 ) ;
cout << cc. VirtFunc ( ) << endl ;
povratak 0 ;
}

Nakon izvršenja našeg koda, dobit ćemo grešku. Ova pogreška je u osnovi to što ne možemo instancirati apstraktnu klasu što pokušavamo učiniti ovdje u našoj glavnoj metodi. Ovdje treba napomenuti da su varijabla i apstraktni tip u našoj poruci promijenjeni.

Sada ćemo pokušati ukloniti našu grešku i izvršiti naš kod. U tu svrhu kreirat ćemo objekt naše podređene klase i napraviti njegovu instancu. Uz pomoć te instance, pozvati ćemo i virtualnu i drugu metodu u našoj apstraktnoj klasi. Također će se promatrati možemo li pristupiti virtualnoj funkciji koristeći podređenu klasu ili ne. Ako smo u tome uspješni, možemo reći da smo pristupili apstraktnoj klasi koristeći njezinu izvedenu klasu.

Nakon izvođenja našeg koda, prevodilac ovaj put nije izbacio nikakvu pogrešku. Umjesto toga, sustav je uspješno kompajlirao naš kod i dao nam izlaz. Sada, pogledajmo izlaz. Sustav je ispisao 'Vrijednost proslijeđenu korištenjem objekta' i '5' pored njega. Zato što smo prošli 5 koristeći našu instancu u glavnoj metodi. Nakon toga, ispisao je redak koji smo od njega tražili u našoj virtualnoj funkciji.

Zaključak

U ovom smo vodiču raspravljali o kritičnim pogreškama s kojima se programeri susreću tijekom kodiranja i prakticiranja objektno orijentiranih koncepata. Ove vrste pogrešaka često se javljaju kada programer radi s apstraktnim klasama. Cijeli članak sažima da se apstraktne klase ne mogu instancirati i ne možemo natjerati njihove objekte da pozivaju metode u njemu. Također smo isprobali različite primjere za stvaranje pogrešaka i zatim riješili pogreške u našem kodu.