Hiba: Nem lehet példányosítani az absztrakt osztályt

Hiba Nem Lehet Peldanyositani Az Absztrakt Osztalyt



Ez a cikk egy másik hibáról szól, amely gyakran előfordul, amikor absztrakt osztályokkal dolgozunk a kódunkban. Tanulmányozzuk az absztrakt osztályok fogalmát az objektumorientált programozásban. Absztrakt osztálynak nevezzük azt az osztályt, amely nem hozhat létre önmagából objektumokat. A C++ nyelvben interfésznek is nevezik. Bármely osztály absztrakttá tehető a C++ nyelvben, ha tisztán virtuális függvényt deklarálunk benne. Egy virtuális függvény deklarálásához a függvény után „=0”-t kell elhelyeznünk. Az absztrakt osztály szülő- vagy alaposztályként működik, amelyből az összes többi gyermekosztály származik. Tehát az absztrakt osztály eléréséhez örökölnünk kell az alaposztályaiból. Amikor megpróbálunk példányosítani egy absztrakt osztályt, fordítási hibát kapunk.

Szintaxis

A hibánk hibaüzenete a következő:

hiba : nem deklarálhatja, hogy a „” változó absztrakt típusú „”

Vegye figyelembe, hogy az üres zárójelben változók és absztrakt osztálynevek lesznek.







hiba C2259 : 'Állapot' : nem tud példányosítani az absztrakt osztályt

Ez egy másik üzenet, amelyet a fordítótól kapunk, amikor ilyen hibával találkozunk.



01. példa:

Hogy ez a hiba érthető legyen, végrehajtunk egy példát, amelyben úgy írjuk meg a kódunkat, hogy hibát kapjunk. Ebből a célból inicializáltunk egy osztályt „ShapeClass” néven. Annak érdekében, hogy ez az osztály absztrakt legyen, deklaráltunk benne egy virtuális függvényt „getArea” néven. Két másik függvényt is deklaráltunk „setWidth” és „setHeight” néven. Itt azt szeretnénk elérni, hogy a magasságot paraméterként, a szélességet pedig bemeneti paraméterként kapjuk meg. A területet a bemeneti paramétereink segítségével fogjuk kiszámítani. A fő metódusban létrehoztuk az osztályunk példányát. Az objektum segítségével meghívtuk a metódusokat, és ezeken a metódusokon keresztül fogjuk átadni a bemeneti paramétereket. Ezt követően kinyomtattuk a kimenetünket, hogy ellenőrizzük az eredményeket.



#include

névtér std használatával ;
osztály ShapeClass
{
nyilvános :
virtuális int Getaria ( ) = 0 ;
üres setWidth ( int ban ben )
{
szélesség = ban ben ;
}
üres setHeight ( int h )
{
magasság = h ;
}
védett :
int szélesség ;
int magasság ;
} ;
int fő- ( üres )
{
ShapeClasssh ;
SH. setWidth ( 1 ) ;
SH. setHeight ( két ) ;
cout << 'Téglalap teljes területe: ' << SH. Getaria ( ) << endl ;
Visszatérés 0 ;
}

A rendszer hibát adott a kódunk végrehajtása után. A hibaüzenet azt mondja, hogy az „sh” változót nem deklarálhatjuk „shapeclass” absztrakt típusúnak. Most a fordító azt próbálja érzékeltetni, hogy a „ShapeClass” egy absztrakt típus, és nem tudjuk deklarálni a változóját. Tehát az üzenettel világosan megérthetjük, hogy a fordító nem engedi, hogy példányosítsuk az absztrakt osztályunkat, ezért a rendszer hibát jelez.





A hiba megoldása érdekében egy másik osztályt „Téglalap” deklaráltunk. Ez az osztály lesz absztrakt osztályunk gyermekosztálya, és ebben az osztályban deklaráljuk a virtuális függvényünk törzsét. Ezt követően a fő metódusban létrehozzuk az objektumát, és az objektuma segítségével hívjuk meg a függvényeket.



A módosítások után elkészítettük kódunkat, és mostanra sikeresen futtattuk kódunkat. A rendszer hiba nélkül végrehajtotta a kódunkat. A kimeneten láthatjuk, hogy a rendszer kiszámolta egy téglalap területét és kinyomtatta a kimenetet. Megtanultuk, hogy a hibánk az volt, hogy közvetlenül az absztrakt osztályunk tárgyát neveztük meg, ami rossz megközelítés volt. Amikor meghívtuk a gyermekosztályának objektumát, a kódunk jól működött.

02. példa:

Ebben a példában nem fogunk matematikai számításokat végezni. Ez a példa egy általános példa, amely segít megérteni az absztrakt osztályokat, és azt, hogy a fordító hogyan fut a metódusok és az osztályok között a kód végrehajtása közben. Ebben az osztályban létrehoztunk egy absztrakt osztályt, és elneveztük „AbsClass”-nak. Egy másik osztályt „ChildClass”-nak nyilvánítottunk, de ez nem egy absztrakt osztály. Ez az osztály az absztrakt osztályunkból származik.

Az absztrakt osztályban deklarált metódusban kinyomtattuk az „Objektum használatával átadott érték” szöveget. A függvény neve „valueFunc”. Amint azt megbeszéltük, a virtuális függvény törzsét a gyermekosztályban deklarálják. Gyermekosztályunkban a virtuális függvénytörzsbe nyomtattuk a „Virtuális függvényben” szöveget. Most átadunk egy értéket az értékfüggvényünknek, és megnézzük, hogy az elért érték helyes-e. Fő metódusunkban létrehoztuk az absztrakt osztályunk egy példányát, és a példány segítségével meghívjuk a virtuális és egyéb függvényeinket. Most végrehajtjuk a kódunkat.

#include

névtér std használatával ;
osztály AbsClass
{
nyilvános :
virtuális int VirtFunc ( ) = 0 ;
üres valueFunc ( int ban ben )
{
szélesség = ban ben ;
cout << 'Objektum használatával átadott érték' << ban ben << endl ;
}
védett :
int szélesség ;
} ;
osztály ChildClass :
nyilvános AbsClass
{
nyilvános :
int VirtFunc ( ) {
cout << 'Virtuális funkcióban' << endl ;
}
} ;
int fő- ( üres )
{
ChildClass cc ;
cc. valueFunc ( 5 ) ;
cout << cc. VirtFunc ( ) << endl ;
Visszatérés 0 ;
}

A kódunk végrehajtása után hibaüzenetet kapunk. Ez a hiba alapvetően abból adódik, hogy nem tudunk egy absztrakt osztályt példányosítani, amit itt a fő módszerünkben próbálunk megtenni. Itt meg kell jegyezni, hogy az üzenetünkben szereplő változó és absztrakt típus megváltozott.

Most megpróbáljuk eltávolítani a hibánkat, és végrehajtani a kódunkat. Ebből a célból létrehozzuk gyermekosztályunk objektumát, és elkészítjük annak példányát. Ennek a példánynak a segítségével meghívjuk a virtuális és egy másik metódust is az absztrakt osztályunkban. Az is megfigyelhető, hogy a gyermekosztály segítségével hozzáférhetünk-e a virtuális függvényhez vagy sem. Ha ez sikerül, azt mondhatjuk, hogy elértük az absztrakt osztályt a származtatott osztályával.

A kódunk futtatásakor a fordító ezúttal nem dobott ki hibát. Ehelyett a rendszer sikeresen lefordította a kódunkat, és megadta a kimenetet. Most pedig vessünk egy pillantást a kimenetre. A rendszer rányomta az „Objektum használatával átadott érték” és „5” feliratot. Mert 5-öt teljesítettünk a főmetódusbeli példányunk használatával. Ezt követően kinyomtatta azt a sort, amelyre a virtuális függvényünkben kértük.

Következtetés

Ebben az útmutatóban megvitattuk azokat a kritikus hibákat, amelyekkel a programozók szembesülnek az objektumorientált koncepciók kódolása és gyakorlása során. Az ilyen típusú hibák gyakran előfordulnak, amikor a programozó absztrakt osztályokkal foglalkozik. Az egész cikk összefoglalja, hogy az absztrakt osztályokat nem lehet példányosítani, és nem tehetjük meg benne az objektumokat metódushívásnak. Különböző példákkal is megpróbáltunk hibákat létrehozni, majd kijavítottuk a kódunkban lévő hibákat.