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.
#includeuporaba 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.