Napaka: abstraktnega razreda ni mogoče ustvariti

Napaka Abstraktnega Razreda Ni Mogoce Ustvariti



Ta članek govori o drugi napaki, ki se pogosto pojavi, ko delamo z abstraktnimi razredi v naši kodi. Preučimo koncept abstraktnih razredov v objektno usmerjenem programiranju. Razred, iz katerega ni mogoče ustvariti nobenih predmetov, je znan kot abstraktni razred. Imenuje se tudi vmesnik v jeziku C++. Vsak razred je mogoče narediti abstrakten v jeziku C++ tako, da v njem deklarirate čisto virtualno funkcijo. Če želite deklarirati virtualno funkcijo, moramo za funkcijo postaviti »=0«. Abstraktni razred deluje kot nadrejeni ali osnovni razred, iz katerega izhajajo vsi drugi podrejeni razredi. Torej, za dostop do abstraktnega razreda ga moramo podedovati od njegovih osnovnih razredov. Ko poskušamo instancirati abstraktni razred, dobimo napako pri prevajanju.

Sintaksa

Sporočilo o naši napaki je naslednje:

napaka : ne more izjaviti, da je spremenljivka » « abstraktnega tipa »

Upoštevajte, da bodo v praznem oklepaju imena spremenljivk in abstraktnih razredov.







napaka C2259 : 'Država' : ne more instancirati abstraktnega razreda

To je še eno sporočilo, ki ga prejmemo od prevajalnika, ko naletimo na takšno napako.



Primer št. 01:

Da bo ta napaka razumljiva, bomo izvedli primer, v katerem bomo našo kodo napisali tako, da dobimo napako. V ta namen smo inicializirali razred z imenom »ShapeClass«. Da bi bil ta razred abstrakten, smo v njem deklarirali virtualno funkcijo z imenom 'getArea'. Razglasili smo tudi dve drugi funkciji z imeni 'setWidth' in 'setHeight'. Tukaj želimo doseči višino kot parameter in širino kot vhodni parameter. Površino bomo izračunali s pomočjo naših vhodnih parametrov. Ustvarili smo primerek našega razreda v glavni metodi. S pomočjo tega objekta smo poklicali metode in skozi te metode bomo posredovali vhodne parametre. Po tem smo natisnili naš rezultat, da smo preverili rezultate.



#include

uporaba imenskega prostora std ;
razred ShapeClass
{
javnosti :
virtualni int Getaria ( ) = 0 ;
praznina setWidth ( int v )
{
premer = v ;
}
praznina setHeight ( int h )
{
višina = h ;
}
zaščiten :
int premer ;
int višina ;
} ;
int glavni ( praznina )
{
ShapeClasssh ;
sh. setWidth ( 1 ) ;
sh. setHeight ( dva ) ;
cout << 'Skupna površina pravokotnika: ' << sh. Getaria ( ) << konec ;
vrnitev 0 ;
}

Sistem nam je po izvedbi naše kode javil napako. Sporočilo o napaki pravi, da spremenljivke »sh« ne moremo razglasiti za abstraktno vrsto »shapeclass«. Sedaj poskuša prevajalnik sporočiti, da je 'ShapeClass' abstrakten tip in ne moremo deklarirati njegove spremenljivke. Torej, s sporočilom lahko jasno razumemo, da nam prevajalnik ne dovoli instanciranja našega abstraktnega razreda, zato nam sistem izda napako.





Da bi odpravili napako, smo razglasili drug razred 'Rectangle'. Ta razred bo podrejeni razred našega abstraktnega razreda in v tem razredu bomo razglasili telo naše virtualne funkcije. Nato bomo v glavni metodi ustvarili njegov objekt in s pomočjo njegovega objekta klicali funkcije.



Po spremembah smo naredili našo kodo in zdaj smo jo uspešno izvajali. Sistem je našo kodo izvedel brez napak. V izpisu lahko vidimo, da je sistem izračunal ploščino pravokotnika in natisnil izhod. Naučili smo se, da je bila naša napaka ta, da smo neposredno klicali objekt našega abstraktnega razreda, kar je bil napačen pristop. Ko smo poklicali objekt njegovega podrejenega razreda, je naša koda začela delovati dobro.

Primer št. 02:

V tem primeru ne bomo delali nobenih matematičnih izračunov. Ta primer je splošen primer, ki nam bo pomagal razumeti abstraktne razrede in kako prevajalnik teče med metodami in razredi med izvajanjem kode. V tem razredu smo ustvarili abstraktni razred in ga poimenovali »AbsClass«. Razglasili smo še en razred 'ChildClass', vendar ta ni abstrakten razred. Ta razred je izpeljan iz našega abstraktnega razreda.

V metodi, deklarirani v abstraktnem razredu, smo natisnili »Vrednost, posredovano z uporabo predmeta«. Ime funkcije je 'valueFunc'. Kot smo razpravljali, je telo navidezne funkcije deklarirano v podrejenem razredu. V našem podrejenem razredu smo v telesu naše virtualne funkcije natisnili »V virtualni funkciji«. Zdaj bomo posredovali vrednost naši funkciji vrednosti in videli, ali je dosežena vrednost pravilna. V naši glavni metodi smo ustvarili primerek našega abstraktnega razreda in s pomočjo primerka bomo klicali naše virtualne in druge funkcije. Zdaj bomo izvedli našo kodo.

#include

uporaba imenskega prostora std ;
razred AbsClass
{
javnosti :
virtualni int VirtFunc ( ) = 0 ;
praznina valueFunc ( int v )
{
premer = v ;
cout << 'Vrednost, posredovana z uporabo predmeta' << v << konec ;
}
zaščiten :
int premer ;
} ;
razred ChildClass :
javni AbsClass
{
javnosti :
int VirtFunc ( ) {
cout << 'V virtualni funkciji' << konec ;
}
} ;
int glavni ( praznina )
{
ChildClass cc ;
cc valueFunc ( 5 ) ;
cout << cc VirtFunc ( ) << konec ;
vrnitev 0 ;
}

Po izvedbi naše kode bomo prejeli napako. Ta napaka je v bistvu v tem, da ne moremo instancirati abstraktnega razreda, kar poskušamo narediti tukaj v naši glavni metodi. Tu je treba opozoriti na to, da sta spremenljivka in abstraktni tip v našem sporočilu spremenjena.

Zdaj bomo poskusili odstraniti našo napako in izvesti našo kodo. V ta namen bomo ustvarili predmet našega podrejenega razreda in naredili njegov primerek. S pomočjo tega primerka bomo poklicali tako virtualno kot drugo metodo v našem abstraktnem razredu. Opazovalo se bo tudi, ali lahko dostopamo do virtualne funkcije z uporabo podrejenega razreda ali ne. Če smo pri tem uspešni, lahko rečemo, da smo dostopali do abstraktnega razreda z uporabo njegovega izpeljanega razreda.

Po izvedbi naše kode prevajalnik tokrat ni vrgel nobene napake. Namesto tega je sistem uspešno prevedel našo kodo in nam dal rezultat. Zdaj pa si poglejmo izhod. Sistem je natisnil »Vrednost, posredovana z uporabo predmeta« in »5« proti njej. Ker smo opravili 5 z uporabo našega primerka v glavni metodi. Po tem je natisnil vrstico, ki smo jo zahtevali v naši virtualni funkciji.

Zaključek

V tem priročniku smo razpravljali o kritičnih napakah, s katerimi se programerji srečujejo med kodiranjem in izvajanjem objektno usmerjenih konceptov. Te vrste napak se pogosto pojavijo, ko se programer ukvarja z abstraktnimi razredi. Celoten članek povzema, da abstraktnih razredov ni mogoče instancirati in ne moremo omogočiti, da njihovi objekti kličejo metod v njem. Preizkusili smo tudi različne primere za ustvarjanje napak in nato odpravili napake v naši kodi.