Klaida: nepavyko sukurti abstrakčios klasės egzempliorių

Klaida Nepavyko Sukurti Abstrakcios Klases Egzemplioriu



Šis straipsnis yra apie kitą klaidą, kuri dažnai pasitaiko, kai dirbame su abstrakčiomis klasėmis savo kode. Panagrinėkime abstrakčių klasių sampratą objektiniame programavime. Klasė, kuri negali turėti iš savęs sukurtų objektų, vadinama abstrakčia klase. C++ kalboje ji dar vadinama sąsaja. Bet kuri klasė gali būti abstrakčia C++ kalba, deklaruojant joje gryną virtualią funkciją. Norėdami deklaruoti virtualią funkciją, po funkcijos turime įdėti „=0“. Abstrakčioji klasė veikia kaip pagrindinė arba pagrindinė klasė, iš kurios gaunamos visos kitos antrinės klasės. Taigi, norėdami pasiekti abstrakčią klasę, turime ją paveldėti iš bazinių klasių. Kai bandome sukurti abstrakčią klasę, gauname kompiliavimo klaidą.

Sintaksė

Mūsų klaidos pranešimas yra toks:

klaida : negali paskelbti, kad kintamasis '' yra abstraktaus tipo ''

Atkreipkite dėmesį, kad tuščiuose skliausteliuose bus kintamųjų ir abstrakčių klasių pavadinimai.







klaida C2259 : 'valstybė' : negali egzistuoti abstrakčios klasės

Tai dar vienas pranešimas, kurį gauname iš kompiliatoriaus, kai susiduriame su tokia klaida.



01 pavyzdys:

Kad ši klaida būtų suprantama, atliksime pavyzdį, kuriame savo kodą parašysime taip, kad gautume klaidą. Tuo tikslu inicijavome klasę pavadinimu „ShapeClass“. Kad ši klasė būtų abstrakti, joje paskelbėme virtualią funkciją pavadinimu „getArea“. Mes taip pat paskelbėme dvi kitas funkcijas atitinkamai pavadinimais „setWidth“ ir „setHeight“. Čia norime gauti aukštį kaip parametrą ir plotį kaip įvesties parametrą. Mes apskaičiuosime plotą naudodami įvesties parametrus. Sukūrėme savo klasės egzempliorių naudodami pagrindinį metodą. To objekto pagalba iškvietėme metodus ir per tuos metodus perduosime įvesties parametrus. Po to išspausdinome savo išvestį, kad patikrintume rezultatus.



#include

naudojant vardų sritį std ;
klasė ShapeClass
{
viešas :
virtualus tarpt Getaria ( ) = 0 ;
tuštuma setWidth ( tarpt in )
{
plotis = in ;
}
tuštuma nustatytiAuktis ( tarpt h )
{
aukščio = h ;
}
apsaugotas :
tarpt plotis ;
tarpt aukščio ;
} ;
tarpt pagrindinis ( tuštuma )
{
ShapeClasssh ;
sh. setWidth ( 1 ) ;
sh. nustatytiAuktis ( du ) ;
cout << 'Bendras stačiakampio plotas: ' << sh. Getaria ( ) << endl ;
grąžinti 0 ;
}

Sistema davė mums klaidą po mūsų kodo vykdymo. Klaidos pranešimas sako, kad negalime deklaruoti kintamojo „sh“ kaip abstraktaus tipo „shapeclass“. Dabar kompiliatorius bando perteikti, kad „ShapeClass“ yra abstraktus tipas ir negalime deklaruoti jo kintamojo. Taigi, naudodamiesi pranešimu, galime aiškiai suprasti, kad kompiliatorius neleidžia mums nustatyti mūsų abstrakčios klasės, todėl sistema pateikia klaidą.





Norėdami išspręsti klaidą, paskelbėme kitą klasę „Stačiakampis“. Ši klasė bus mūsų abstrakčiųjų klasių vaikų klasė ir šioje klasėje paskelbsime savo virtualios funkcijos turinį. Po to pagrindiniu metodu sukursime jo objektą ir jo objekto pagalba iškviesime funkcijas.



Po pakeitimų sukūrėme savo kodą ir dabar sėkmingai įgyvendinome savo kodą. Sistema įvykdė mūsų kodą nepateikdama klaidų. Išvestyje matome, kad sistema apskaičiavo stačiakampio plotą ir atspausdino išvestį. Sužinojome, kad mūsų klaida buvo ta, kad mes tiesiogiai vadinome savo abstrakčiosios klasės objektą, o tai buvo neteisingas požiūris. Kai iškvietėme jo antrinės klasės objektą, mūsų kodas pradėjo veikti gerai.

02 pavyzdys:

Šiame pavyzdyje mes neatliksime jokių matematinių skaičiavimų. Šis pavyzdys yra bendras pavyzdys, kuris padės suprasti abstrakčias klases ir tai, kaip kompiliatorius veikia tarp metodų ir klasių vykdydamas kodą. Šioje klasėje sukūrėme abstrakčią klasę ir pavadinome ją „AbsClass“. Mes paskelbėme kitą klasę „Vaikų klasė“, tačiau ši nėra abstrakti klasė. Ši klasė yra kilusi iš mūsų abstrakčios klasės.

Mes išspausdinome „Vertė, perduota naudojant objektą“ metodu, deklaruotu abstrakčioje klasėje. Funkcijos pavadinimas yra „valueFunc“. Kaip aptarėme, virtualios funkcijos kūnas deklaruojamas vaikų klasėje. Vaikų klasėje savo virtualios funkcijos korpuse išspausdinome „In virtual function“. Dabar mes perduosime reikšmę mūsų vertės funkcijai ir patikrinsime, ar pasiekta vertė yra teisinga. Pagrindiniu metodu sukūrėme savo abstrakčiosios klasės egzempliorių ir jo pagalba iškviesime savo virtualias ir kitas funkcijas. Dabar vykdysime savo kodą.

#include

naudojant vardų sritį std ;
klasė AbsClass
{
viešas :
virtualus tarpt VirtFunc ( ) = 0 ;
tuštuma valueFunc ( tarpt in )
{
plotis = in ;
cout << „Vertė perduota naudojant objektą“ << in << endl ;
}
apsaugotas :
tarpt plotis ;
} ;
klasė Vaikų klasė :
viešoji AbsClass
{
viešas :
tarpt VirtFunc ( ) {
cout << „Virtualioje funkcijoje“ << endl ;
}
} ;
tarpt pagrindinis ( tuštuma )
{
ChildClass cc ;
cc. valueFunc ( 5 ) ;
cout << cc. VirtFunc ( ) << endl ;
grąžinti 0 ;
}

Vykdydami kodą gausime klaidą. Ši klaida iš esmės yra ta, kad negalime sukurti abstrakčios klasės, kurią čia bandome padaryti savo pagrindiniu metodu. Vienas dalykas, į kurį reikia atkreipti dėmesį, yra tai, kad mūsų pranešimo kintamasis ir abstraktus tipas buvo pakeisti.

Dabar bandysime pašalinti klaidą ir vykdyti savo kodą. Tuo tikslu sukursime savo vaikų klasės objektą ir padarysime jo egzempliorių. To egzemplioriaus pagalba iškviesime ir virtualųjį, ir kitą metodą abstrakčioje klasėje. Taip pat bus stebima, ar galime pasiekti virtualią funkciją naudodami vaikų klasę, ar ne. Jei mums tai pavyksta, galime sakyti, kad pasiekėme abstrakčią klasę naudodami išvestinę klasę.

Vykdydamas mūsų kodą, kompiliatorius šį kartą nepadarė jokios klaidos. Vietoj to, sistema sėkmingai sukompiliavo mūsų kodą ir suteikė mums išvestį. Dabar pažvelkime į išvestį. Sistema atspausdino „Vertė perduota naudojant objektą“ ir „5“. Kadangi mes išlaikėme 5, naudodami mūsų egzempliorių pagrindiniame metode. Po to jis išspausdino eilutę, kurios paprašėme mūsų virtualioje funkcijoje.

Išvada

Šiame vadove aptarėme kritines klaidas, su kuriomis susiduria programuotojai, koduodami ir praktikuodami objektines koncepcijas. Tokio tipo klaidos dažnai atsiranda, kai programuotojas susiduria su abstrakčiomis klasėmis. Visame straipsnyje apibendrinama, kad abstrakčių klasių negalima kartoti ir mes negalime jame priversti jų objektų vadinti metodus. Taip pat išbandėme įvairius pavyzdžius, kad sukurtume klaidas, o tada išsprendėme savo kodo klaidas.