Kļūda: nevar izveidot abstrakto klasi

Kluda Nevar Izveidot Abstrakto Klasi



Šis raksts ir par citu kļūdu, kas bieži rodas, strādājot ar abstraktām klasēm savā kodā. Izpētīsim abstrakto klašu jēdzienu objektorientētā programmēšanā. Klase, kurā nevar izveidot no sevis objektus, ir pazīstama kā abstrakta klase. C++ valodā to sauc arī par interfeisu. Jebkuru klasi var padarīt abstraktu C++ valodā, deklarējot tajā tīru virtuālu funkciju. Lai deklarētu virtuālo funkciju, aiz funkcijas ir jāievieto “=0”. Abstraktā klase darbojas kā vecāka vai bāzes klase, no kuras tiek atvasinātas visas pārējās pakārtotās klases. Tātad, lai piekļūtu abstraktajai klasei, mums tā ir jāmanto no tās bāzes klasēm. Mēģinot izveidot abstraktu klasi, mēs iegūstam kompilācijas kļūdu.

Sintakse

Mūsu kļūdas kļūdas ziņojums ir šāds:

kļūda : nevar deklarēt, ka mainīgais '' ir abstrakta tipa ''

Ņemiet vērā, ka tukšās iekavās būs mainīgie un abstraktie klašu nosaukumi.







kļūda C2259 : 'Valsts' : nevar izveidot abstraktu klasi

Šis ir vēl viens ziņojums, ko saņemam no kompilatora, kad sastopamies ar šādu kļūdu.



01. piemērs:

Lai šī kļūda būtu saprotama, mēs izpildīsim piemēru, kurā mēs ierakstīsim savu kodu tā, lai mēs iegūtu kļūdu. Šim nolūkam esam inicializējuši klasi ar nosaukumu “ShapeClass”. Lai padarītu šo klasi abstraktu, mēs tajā esam deklarējuši virtuālu funkciju ar nosaukumu “getArea”. Mēs esam deklarējuši arī divas citas funkcijas ar attiecīgi nosaukumiem “setWidth” un “setHeight”. Šeit mēs vēlamies iegūt augstumu kā parametru un platumu kā ievades parametru. Mēs aprēķināsim laukumu, izmantojot mūsu ievades parametrus. Mēs izveidojām savas klases gadījumu galvenajā metodē. Ar šī objekta palīdzību mēs esam izsaukuši metodes un caur šīm metodēm nodosim ievades parametrus. Pēc tam mēs izdrukājām savu rezultātu, lai pārbaudītu rezultātus.



#include

izmantojot namespace std ;
klase ShapeClass
{
publiski :
virtuāls starpt Getaria ( ) = 0 ;
nederīgs setWidth ( starpt iekšā )
{
platums = iekšā ;
}
nederīgs iestatītAugstums ( starpt h )
{
augstums = h ;
}
aizsargāts :
starpt platums ;
starpt augstums ;
} ;
starpt galvenais ( nederīgs )
{
ShapeClasssh ;
sh. setWidth ( 1 ) ;
sh. iestatītAugstums ( divi ) ;
cout << 'Kopējais taisnstūra laukums:' << sh. Getaria ( ) << endl ;
atgriezties 0 ;
}

Sistēma mums radīja kļūdu pēc mūsu koda izpildes. Kļūdas ziņojumā teikts, ka mēs nevaram deklarēt mainīgo “sh” kā abstrakta tipa “shapeclass”. Tagad kompilators mēģina pateikt, ka “ShapeClass” ir abstrakts veids un mēs nevaram deklarēt tā mainīgo. Tātad ar ziņojumu mēs varam skaidri saprast, ka kompilators neļauj mums izveidot mūsu abstrakto klasi, tāpēc sistēma mums rada kļūdu.





Lai novērstu kļūdu, mēs deklarējām citu klasi “Taisnstūris”. Šī klase būs mūsu abstraktās klases bērnu klase, un mēs šajā klasē deklarēsim savas virtuālās funkcijas pamattekstu. Pēc tam mēs izveidosim tā objektu galvenajā metodē un ar tā objekta palīdzību izsauksim funkcijas.



Pēc grozījumiem mēs izveidojām savu kodu, un tagad esam veiksmīgi izmantojuši savu kodu. Sistēma ir izpildījusi mūsu kodu, neradot kļūdas. Izvadā redzam, ka sistēma ir aprēķinājusi taisnstūra laukumu un izdrukājusi izvadi. Mēs uzzinājām, ka mūsu kļūda bija tā, ka mēs tieši nosaucām savas abstraktās klases objektu, kas bija nepareiza pieeja. Kad mēs izsaucām tā atvasinātās klases objektu, mūsu kods sāka darboties labi.

02. piemērs:

Šajā piemērā mēs neveiksim matemātiskos aprēķinus. Šis piemērs ir vispārīgs piemērs, kas palīdzēs mums izprast abstraktās klases un to, kā kompilators darbojas starp metodēm un klasēm, izpildot kodu. Šajā klasē mēs esam izveidojuši abstraktu klasi un nosaukuši to “AbsClass”. Mēs esam pasludinājuši citu klasi “ChildClass”, bet šī nav abstrakta klase. Šī klase ir atvasināta no mūsu abstraktās klases.

Mēs esam izdrukājuši “Vērtība, kas nodota, izmantojot objektu” metodē, kas deklarēta abstraktajā klasē. Funkcijas nosaukums ir “valueFunc”. Kā mēs apspriedām, virtuālās funkcijas pamatteksts tiek deklarēts bērnu klasē. Mūsu bērnu klasē mēs savā virtuālās funkcijas pamattekstā esam iespieduši “In virtual function”. Tagad mēs nosūtīsim vērtību savai vērtības funkcijai un pārbaudīsim, vai sasniegtā vērtība ir pareiza. Mūsu galvenajā metodē mēs esam izveidojuši savas abstraktās klases instanci un ar tās palīdzību mēs izsauksim savas virtuālās un citas funkcijas. Tagad mēs izpildīsim mūsu kodu.

#include

izmantojot namespace std ;
klase AbsClass
{
publiski :
virtuāls starpt VirtFunc ( ) = 0 ;
nederīgs valueFunc ( starpt iekšā )
{
platums = iekšā ;
cout << 'Vērtība nodota, izmantojot objektu' << iekšā << endl ;
}
aizsargāts :
starpt platums ;
} ;
klase Bērnu klase :
publiska AbsClass
{
publiski :
starpt VirtFunc ( ) {
cout << 'Virtuālajā funkcijā' << endl ;
}
} ;
starpt galvenais ( nederīgs )
{
ChildClass cc ;
cc. valueFunc ( 5 ) ;
cout << cc. VirtFunc ( ) << endl ;
atgriezties 0 ;
}

Pēc mūsu koda izpildes mēs saņemsim kļūdu. Šī kļūda būtībā ir tāda, ka mēs nevaram izveidot abstraktu klasi, ko mēs cenšamies izdarīt šeit, izmantojot mūsu galveno metodi. Šeit jāatzīmē viena lieta, ka mainīgais un abstraktais veids mūsu ziņojumā ir mainīts.

Tagad mēs mēģināsim noņemt mūsu kļūdu un izpildīt mūsu kodu. Šim nolūkam mēs izveidosim mūsu bērnu klases objektu un izveidosim tā instanci. Ar šīs instances palīdzību mēs savā abstraktajā klasē izsauksim gan virtuālo, gan citu metodi. Tiks arī novērots, vai mēs varam piekļūt virtuālajai funkcijai, izmantojot bērnu klasi vai nē. Ja mums tas izdodas, mēs varam teikt, ka esam piekļuvuši abstraktajai klasei, izmantojot tās atvasināto klasi.

Izpildot mūsu kodu, kompilators šoreiz nav izlaidis nevienu kļūdu. Tā vietā sistēma ir veiksmīgi apkopojusi mūsu kodu un devusi mums izvadi. Tagad apskatīsim rezultātu. Sistēma pret to ir nodrukājusi “Vērtība nodota, izmantojot objektu” un “5”. Tā kā mēs nokārtojām 5, izmantojot mūsu gadījumu galvenajā metodē. Pēc tam tas izdrukāja rindiņu, kuru mēs tai prasījām mūsu virtuālajā funkcijā.

Secinājums

Šajā rokasgrāmatā mēs apspriedām kritiskās kļūdas, ar kurām programmētāji saskaras, kodējot un praktizējot objektorientētas koncepcijas. Šāda veida kļūdas bieži rodas, kad programmētājs nodarbojas ar abstraktām klasēm. Visā rakstā ir apkopots, ka abstraktās klases nevar būt instantiācijas, un mēs nevaram likt to objektiem izsaukt metodes. Mēs arī izmēģinājām dažādus piemērus, lai radītu kļūdas, un pēc tam atrisinājām kļūdas savā kodā.