Virhe: Abstraktia luokkaa ei voi ilmentää

Virhe Abstraktia Luokkaa Ei Voi Ilmentaa



Tämä artikkeli käsittelee toista virhettä, joka tapahtuu usein, kun käsittelemme koodissamme abstrakteja luokkia. Tutkitaanpa abstraktien luokkien käsitettä olio-ohjelmoinnissa. Luokka, jolla ei voi olla itsestään luotuja objekteja, tunnetaan abstraktina luokkana. Sitä kutsutaan myös C++-kielellä käyttöliittymäksi. Mikä tahansa luokka voidaan tehdä abstraktiksi C++-kielellä julistamalla siihen puhdas virtuaalifunktio. Virtuaalifunktion ilmoittamiseksi meidän on sijoitettava '=0' funktion perään. Abstrakti luokka toimii ylä- tai perusluokkana, josta kaikki muut alaluokat johdetaan. Joten päästäksemme abstraktiin luokkaan, meidän on perittävä se perusluokistaan. Kun yritämme ilmentää abstraktia luokkaa, saamme käännösvirheen.

Syntaksi

Virheemme virheilmoitus on seuraava:

virhe : ei voi ilmoittaa muuttujaa '' olevan abstraktia tyyppiä'

Huomaa, että tyhjissä suluissa on muuttujien ja abstraktien luokkien nimet.







virhe C2259 : 'Osavaltio' : ei voi ilmentää abstraktia luokkaa

Tämä on toinen viesti, jonka saamme kääntäjältä, kun kohtaamme tällaisen virheen.



Esimerkki # 01:

Jotta tämä virhe olisi ymmärrettävä, teemme esimerkin, jossa kirjoitamme koodimme siten, että saamme virheen. Tätä tarkoitusta varten olemme alustaneet luokan nimeltä 'ShapeClass'. Jotta tämä luokka olisi abstrakti, olemme ilmoittaneet siihen virtuaalisen funktion nimellä 'getArea'. Olemme ilmoittaneet myös kaksi muuta funktiota nimillä 'setWidth' ja 'setHeight'. Haluamme tehdä tässä, että haluamme saada korkeuden parametriksi ja leveyden syöttöparametriksi. Laskemme alueen syöteparametreidemme avulla. Loimme luokkamme esiintymän päämenetelmässä. Tämän objektin avulla olemme kutsuneet menetelmät ja välitämme syöttöparametrit näiden metodien kautta. Sen jälkeen tulostimme tulostemme tarkistaaksemme tulokset.



#include

käyttäen nimiavaruutta std ;
luokka ShapeClass
{
julkinen :
virtuaalinen int Getaria ( ) = 0 ;
mitätön setWidth ( int sisään )
{
leveys = sisään ;
}
mitätön aseta Korkeus ( int h )
{
korkeus = h ;
}
suojattu :
int leveys ;
int korkeus ;
} ;
int pää ( mitätön )
{
ShapeClasssh ;
sh. setWidth ( 1 ) ;
sh. aseta Korkeus ( kaksi ) ;
cout << 'Suorakulmion kokonaispinta-ala: ' << sh. Getaria ( ) << endl ;
palata 0 ;
}

Järjestelmä antoi meille virheilmoituksen koodimme suorittamisen jälkeen. Virheilmoitus sanoo, että emme voi ilmoittaa muuttujaa 'sh' abstraktin tyyppiseksi 'shapeclass'. Nyt kääntäjä yrittää kertoa, että 'ShapeClass' on abstrakti tyyppi, emmekä voi ilmoittaa sen muuttujaa. Joten viestin avulla voimme selvästi ymmärtää, että kääntäjä ei anna meidän ilmentää abstraktia luokkaamme, minkä vuoksi järjestelmä antaa meille virheen.





Virheen ratkaisemiseksi julistimme toisen luokan 'suorakulmio'. Tämä luokka tulee olemaan abstraktin luokkamme lapsiluokka ja julistamme tässä luokassa virtuaalifunktiomme rungon. Sen jälkeen luomme sen objektin päämenetelmässä ja sen objektin avulla kutsumme funktioita.



Muutosten jälkeen teimme koodimme ja olemme nyt onnistuneet käyttämään koodiamme. Järjestelmä on suorittanut koodimme antamatta virheitä. Näemme tuloksesta, että järjestelmä on laskenut suorakulmion alan ja tulostanut tulosteen. Olemme oppineet, että virheemme oli se, että kutsuimme suoraan abstraktin luokkamme objektia, mikä oli väärä lähestymistapa. Kun kutsuimme sen aliluokan objektia, koodimme alkoi toimia hyvin.

Esimerkki # 02:

Tässä esimerkissä emme suorita matemaattisia laskelmia. Tämä esimerkki on yleinen esimerkki, joka auttaa meitä ymmärtämään abstrakteja luokkia ja kuinka kääntäjä toimii menetelmien ja luokkien välillä suorittaessaan koodia. Tällä luokalla olemme luoneet abstraktin luokan ja nimenneet sille 'AbsClass'. Olemme julistaneet toisen luokan 'ChildClass', mutta tämä ei ole abstrakti luokka. Tämä luokka on johdettu abstraktista luokastamme.

Olemme painaneet 'Objektin avulla välitetty arvo' abstraktissa luokassa ilmoitetulla menetelmällä. Toiminnon nimi on 'valueFunc'. Kuten keskustelimme, virtuaalifunktion runko ilmoitetaan lapsiluokassa. Lapsiluokallamme olemme painaneet virtuaalifunktiorungossamme 'Virtuaalifunktiossa'. Nyt välitämme arvon arvofunktiollemme ja katsomme, onko saavutettu arvo oikea. Päämenetelmässämme olemme luoneet abstraktin luokkamme ilmentymän ja instanssin avulla kutsumme virtuaalisia ja muita toimintojamme. Nyt suoritamme koodimme.

#include

käyttäen nimiavaruutta std ;
luokka AbsClass
{
julkinen :
virtuaalinen int VirtFunc ( ) = 0 ;
mitätön valueFunc ( int sisään )
{
leveys = sisään ;
cout << 'Objektin avulla välitetty arvo' << sisään << endl ;
}
suojattu :
int leveys ;
} ;
luokka Lapsiluokka :
julkinen AbsClass
{
julkinen :
int VirtFunc ( ) {
cout << 'Virtuaalitoiminnossa' << endl ;
}
} ;
int pää ( mitätön )
{
ChildClass cc ;
cc. valueFunc ( 5 ) ;
cout << cc. VirtFunc ( ) << endl ;
palata 0 ;
}

Koodimme suorittamisen jälkeen saamme virheilmoituksen. Tämä virhe johtuu periaatteessa siitä, että emme voi ilmentää abstraktia luokkaa, jota yritämme tehdä tässä päämenetelmässämme. Yksi huomioitava asia on, että viestimme muuttuja ja abstrakti tyyppi on muutettu.

Nyt yritämme poistaa virheemme ja suorittaa koodimme. Tätä tarkoitusta varten luomme lapsiluokkamme objektin ja teemme sen ilmentymän. Tuon ilmentymän avulla kutsumme sekä virtuaalista että toista menetelmää abstraktissa luokassamme. Havaitaan myös, pääsemmekö virtuaalitoimintoon lapsiluokalla vai emme. Jos onnistumme siinä, voimme sanoa, että olemme päässeet abstraktiin luokkaan käyttämällä sen johdettua luokkaa.

Koodimme suorittamisen jälkeen kääntäjä ei ole antanut tällä kertaa virhettä. Sen sijaan järjestelmä on kääntänyt koodimme onnistuneesti ja antanut meille tulosteen. Katsotaanpa nyt tulosta. Järjestelmä on painanut sen päälle 'Arvo välitetty objektilla' ja '5'. Koska läpäisimme 5 käyttämällä instanssiamme päämenetelmässä. Sen jälkeen se tulosti sen rivin, jota pyysimme sitä virtuaalitoiminnossamme.

Johtopäätös

Tässä oppaassa käsittelimme kriittisiä virheitä, joita ohjelmoijat kohtaavat koodattaessa ja harjoittaessaan oliokeskeisiä käsitteitä. Tämän tyyppisiä virheitä esiintyy usein, kun ohjelmoija käsittelee abstrakteja luokkia. Koko artikkeli tiivistää, että abstrakteja luokkia ei voi ilmentää, emmekä voi saada niiden objekteja kutsumaan menetelmiä siinä. Kokeilimme myös erilaisia ​​esimerkkejä virheiden luomiseksi ja ratkaisimme sitten koodimme virheet.