Chyba: Nelze vytvořit instanci abstraktní třídy

Chyba Nelze Vytvorit Instanci Abstraktni Tridy



Tento článek je o další chybě, která se často vyskytuje, když pracujeme s abstraktními třídami v našem kódu. Pojďme studovat koncept abstraktních tříd v objektově orientovaném programování. Třída, která nemůže mít ze sebe vytvořené žádné objekty, se nazývá abstraktní třída. V jazyce C++ se mu také říká rozhraní. Jakákoli třída může být abstraktní v jazyce C++ tím, že v ní deklarujete čistě virtuální funkci. Abychom deklarovali virtuální funkci, musíme za funkci umístit „=0“. Abstraktní třída funguje jako nadřazená nebo základní třída, ze které jsou odvozeny všechny ostatní podřízené třídy. Abychom získali přístup k abstraktní třídě, musíme ji zdědit od jejích základních tříd. Když se pokusíme vytvořit instanci abstraktní třídy, dostaneme chybu kompilace.

Syntax

Chybová zpráva o naší chybě je následující:

chyba : nemůže prohlásit proměnnou „ “ za abstraktní typ „“

Všimněte si, že v prázdných závorkách budou názvy proměnných a abstraktních tříd.







chyba C2259 : 'Stát' : nelze vytvořit instanci abstraktní třídy

Toto je další zpráva, kterou dostáváme od kompilátoru, když narazíme na takovou chybu.



Příklad č. 01:

Aby byla tato chyba srozumitelná, provedeme příklad, ve kterém napíšeme náš kód tak, abychom dostali chybu. Za tímto účelem jsme inicializovali třídu s názvem „ShapeClass“. Aby byla tato třída abstraktní, deklarovali jsme v ní virtuální funkci s názvem „getArea“. Deklarovali jsme také dvě další funkce s názvy „setWidth“ a „setHeight“. Co zde chceme udělat, je, že chceme získat jako parametr Výška a jako vstupní parametr šířku. Plochu vypočítáme pomocí našich vstupních parametrů. Vytvořili jsme instanci naší třídy v hlavní metodě. S pomocí tohoto objektu jsme zavolali metody a přes tyto metody předáme vstupní parametry. Poté jsme vytiskli náš výstup, abychom zkontrolovali výsledky.



#include

pomocí jmenného prostoru std ;
třída ShapeClass
{
veřejnost :
virtuální int Getaria ( ) = 0 ;
prázdnota setWidth ( int v )
{
šířka = v ;
}
prázdnota setHeight ( int h )
{
výška = h ;
}
chráněný :
int šířka ;
int výška ;
} ;
int hlavní ( prázdnota )
{
ShapeClasssh ;
sh. setWidth ( 1 ) ;
sh. setHeight ( dva ) ;
cout << 'Celková plocha obdélníku: ' << sh. Getaria ( ) << endl ;
vrátit se 0 ;
}

Po provedení našeho kódu nám systém oznámil chybu. Chybová zpráva říká, že nemůžeme prohlásit proměnnou ‚sh‘ za abstraktní typ ‚shapeclass‘. Nyní se kompilátor snaží sdělit, že ‚ShapeClass‘ je abstraktní typ a nemůžeme deklarovat jeho proměnnou. Takže se zprávou můžeme jasně pochopit, že kompilátor nám nedovoluje vytvořit instanci naší abstraktní třídy, a proto nám systém dává chybu.





Abychom chybu vyřešili, deklarovali jsme jinou třídu ‚Obdélník‘. Tato třída bude podřízenou třídou naší abstraktní třídy a v této třídě budeme deklarovat tělo naší virtuální funkce. Poté vytvoříme její objekt v metodě main a pomocí jejího objektu zavoláme funkce.



Po úpravách jsme vytvořili náš kód a nyní jsme úspěšní ve spuštění našeho kódu. Systém provedl náš kód bez chyb. Ve výstupu vidíme, že systém vypočítal plochu obdélníku a vytiskl výstup. Zjistili jsme, že naší chybou bylo, že jsme přímo volali objekt naší abstraktní třídy, což byl špatný přístup. Když jsme zavolali objekt jeho podřízené třídy, náš kód začal fungovat dobře.

Příklad č. 02:

V tomto příkladu nebudeme provádět žádné matematické výpočty. Tento příklad je obecný příklad, který nám pomůže porozumět abstraktním třídám a tomu, jak kompilátor běží mezi metodami a třídami při provádění kódu. V této třídě jsme vytvořili abstraktní třídu a pojmenovali ji „AbsClass“. Deklarovali jsme jinou třídu „ChildClass“, ale tato není abstraktní třída. Tato třída je odvozena z naší abstraktní třídy.

Vytiskli jsme „Hodnotu předaná pomocí objektu“ v metodě deklarované v abstraktní třídě. Název funkce je „valueFunc“. Jak jsme diskutovali, tělo virtuální funkce je deklarováno v podřízené třídě. V naší dětské třídě jsme do těla virtuální funkce vytiskli „Ve virtuální funkci“. Nyní předáme hodnotu naší funkci hodnot a uvidíme, zda je dosažená hodnota správná. V naší hlavní metodě jsme vytvořili instanci naší abstraktní třídy a pomocí instance budeme volat naše virtuální a další funkce. Nyní provedeme náš kód.

#include

pomocí jmenného prostoru std ;
třída AbsClass
{
veřejnost :
virtuální int VirtFunc ( ) = 0 ;
prázdnota valueFunc ( int v )
{
šířka = v ;
cout << 'Hodnota předaná pomocí objektu' << v << endl ;
}
chráněný :
int šířka ;
} ;
třída ChildClass :
veřejné třídy AbsClass
{
veřejnost :
int VirtFunc ( ) {
cout << 'Ve virtuální funkci' << endl ;
}
} ;
int hlavní ( prázdnota )
{
ChildClass cc ;
cc. valueFunc ( 5 ) ;
cout << cc. VirtFunc ( ) << endl ;
vrátit se 0 ;
}

Po provedení našeho kódu se zobrazí chyba. Tato chyba je v podstatě v tom, že nemůžeme vytvořit instanci abstraktní třídy, o což se zde pokoušíme v naší hlavní metodě. Jedna věc, kterou je třeba poznamenat, je, že proměnná a abstraktní typ v naší zprávě byly změněny.

Nyní se pokusíme odstranit naši chybu a spustit náš kód. Za tímto účelem vytvoříme objekt naší podřízené třídy a vytvoříme jeho instanci. S pomocí této instance zavoláme jak virtuální, tak jinou metodu v naší abstraktní třídě. Bude také sledováno, zda můžeme přistupovat k virtuální funkci pomocí podřízené třídy nebo ne. Pokud se nám to podaří, můžeme říci, že jsme k abstraktní třídě přistoupili pomocí její odvozené třídy.

Po spuštění našeho kódu kompilátor tentokrát nevyvolal žádnou chybu. Místo toho systém úspěšně zkompiloval náš kód a poskytl nám výstup. Nyní se podívejme na výstup. Systém proti němu vytiskl „Hodnota předaná pomocí objektu“ a „5“. Protože jsme předali 5 pomocí naší instance v hlavní metodě. Poté vytiskl řádek, o který jsme ho požádali v naší virtuální funkci.

Závěr

V této příručce jsme diskutovali o kritických chybách, se kterými se programátoři setkávají při kódování a procvičování objektově orientovaných konceptů. Tyto typy chyb se často vyskytují, když se programátor zabývá abstraktními třídami. Celý článek shrnuje, že abstraktní třídy nelze konkretizovat a jejich objekty v něm nemůžeme přimět volat metody. Vyzkoušeli jsme také různé příklady k vytvoření chyb a poté jsme vyřešili chyby v našem kódu.