Грешка: Није могуће инстанцирати апстрактну класу

Greska Nije Moguce Instancirati Apstraktnu Klasu



Овај чланак говори о још једној грешци која се често јавља када радимо са апстрактним класама у нашем коду. Хајде да проучимо концепт апстрактних класа у објектно оријентисаном програмирању. Класа која не може имати ниједан објекат креиран од себе позната је као апстрактна класа. Такође се зове интерфејс у ​​језику Ц++. Свака класа се може учинити апстрактном у језику Ц++ декларисањем чисте виртуелне функције у њој. Да бисмо декларисали виртуелну функцију, морамо да ставимо „=0“ после функције. Апстрактна класа се понаша као надређена или основна класа из које су изведене све остале подређене класе. Дакле, да бисмо приступили апстрактној класи, морамо је наследити од њених основних класа. Када покушамо да инстанцирамо апстрактну класу, добијамо грешку компилације.

Синтакса

Порука о грешци наше грешке је следећа:

грешка : не може да прогласи променљиву „ „ апстрактног типа „“

Имајте на уму да ће у празним заградама бити имена променљивих и апстрактних класа.







грешка Ц2259 : 'Стање' : не може инстанцирати апстрактну класу

Ово је још једна порука коју добијамо од компајлера када наиђемо на такву грешку.



Пример #01:

Да бисмо ову грешку учинили разумљивом, извешћемо пример у коме ћемо написати наш код на начин да добијемо грешку. У ту сврху смо иницијализовали класу са именом „СхапеЦласс“. Да бисмо ову класу учинили апстрактном, у њој смо декларисали виртуелну функцију са именом „гетАреа“. Декларисали смо и две друге функције са називима „сетВидтх“ и „сетХеигхт“ респективно. Оно што желимо да урадимо овде је да желимо да добијемо висину као параметар и ширину као улазни параметар. Површину ћемо израчунати уз помоћ наших улазних параметара. Направили смо инстанцу наше класе у главном методу. Уз помоћ тог објекта смо позвали методе и кроз те методе ћемо проследити улазне параметре. Након тога, одштампали смо наш излаз да проверимо резултате.



#инцлуде <иостреам>

користећи простор имена стд ;
цласс СхапеЦласс
{
јавности :
виртуелни инт Гетариа ( ) = 0 ;
празнина сетВидтх ( инт ин )
{
ширина = ин ;
}
празнина сетХеигхт ( инт х )
{
висина = х ;
}
заштићени :
инт ширина ;
инт висина ;
} ;
инт главни ( празнина )
{
СхапеЦласссх ;
сх. сетВидтх ( 1 ) ;
сх. сетХеигхт ( два ) ;
цоут << 'Укупна површина правоугаоника: ' << сх. Гетариа ( ) << ендл ;
повратак 0 ;
}

Систем нам је дао грешку након извршења нашег кода. Порука о грешци каже да не можемо да прогласимо променљиву 'сх' апстрактног типа 'схапецласс'. Сада, компајлер покушава да пренесе да је „СхапеЦласс“ апстрактни тип и да не можемо да декларишемо његову променљиву. Дакле, са поруком, можемо јасно разумети да нам компајлер не дозвољава да инстанцирамо нашу апстрактну класу, због чега нам систем даје грешку.





Да бисмо решили грешку, прогласили смо другу класу „Правоугаоник“. Ова класа ће бити подређена класа наше апстрактне класе и ми ћемо декларисати тело наше виртуелне функције у овој класи. Након тога ћемо креирати његов објекат у главном методу и уз помоћ његовог објекта позвати функције.



Након измена, направили смо наш код и сада смо успели у раду нашег кода. Систем је извршио наш код без давања грешака. На излазу можемо видети да је систем израчунао површину правоугаоника и одштампао излаз. Научили смо да је наша грешка била што смо директно називали објекат наше апстрактне класе, што је био погрешан приступ. Када смо позвали објекат његове подређене класе, наш код је почео да ради добро.

Пример #02:

У овом примеру нећемо радити никакве математичке прорачуне. Овај пример је генерички пример који ће нам помоћи да разумемо апстрактне класе и како компајлер ради између метода и класа док извршава код. У овој класи смо креирали апстрактну класу и назвали је „АбсЦласс“. Декларисали смо другу класу „ЦхилдЦласс“, али ова није апстрактна класа. Ова класа је изведена из наше апстрактне класе.

Одштампали смо „Вредност пренета коришћењем објекта“ у методи декларисаној у апстрактној класи. Назив функције је „валуеФунц“. Као што смо расправљали, тело виртуелне функције је декларисано у дечјој класи. У нашем дечјем разреду, одштампали смо „У виртуелној функцији“ у телу виртуелне функције. Сада ћемо проследити вредност нашој функцији вредности и видети да ли је достигнута вредност тачна. У нашем главном методу, креирали смо инстанцу наше апстрактне класе и уз помоћ инстанце ћемо позвати наше виртуелне и друге функције. Сада ћемо извршити наш код.

#инцлуде <иостреам>

користећи простор имена стд ;
цласс АбсЦласс
{
јавности :
виртуелни инт ВиртФунц ( ) = 0 ;
празнина валуеФунц ( инт ин )
{
ширина = ин ;
цоут << „Вредност пренета помоћу објекта“ << ин << ендл ;
}
заштићени :
инт ширина ;
} ;
цласс ЦхилдЦласс :
публиц АбсЦласс
{
јавности :
инт ВиртФунц ( ) {
цоут << „У виртуелној функцији“ << ендл ;
}
} ;
инт главни ( празнина )
{
ЦхилдЦласс цц ;
цц. валуеФунц ( 5 ) ;
цоут << цц. ВиртФунц ( ) << ендл ;
повратак 0 ;
}

Након извршења нашег кода, добићемо грешку. Ова грешка је у основи то што не можемо инстанцирати апстрактну класу што покушавамо да урадимо овде у нашој главној методи. Једна ствар коју треба приметити је да су променљива и апстрактни тип у нашој поруци промењени.

Сада ћемо покушати да уклонимо нашу грешку и извршимо наш код. У ту сврху ћемо креирати објекат наше дечје класе и направити његову инстанцу. Уз помоћ те инстанце, позваћемо и виртуелну и другу методу у нашој апстрактној класи. Такође ће се посматрати да ли можемо приступити виртуелној функцији помоћу дечје класе или не. Ако смо успешни у томе, можемо рећи да смо приступили апстрактној класи користећи њену изведену класу.

По извршењу нашег кода, компајлер овог пута није направио ниједну грешку. Уместо тога, систем је успешно компајлирао наш код и дао нам излаз. Сада, хајде да погледамо излаз. Систем је одштампао „Вредност пренета помоћу објекта“ и „5“ против њега. Зато што смо прошли 5 користећи нашу инстанцу у главном методу. Након тога је одштампао линију коју смо тражили у нашој виртуелној функцији.

Закључак

У овом водичу смо говорили о критичним грешкама са којима се програмери сусрећу док кодирају и практикују објектно оријентисане концепте. Ове врсте грешака се често јављају када се програмер бави апстрактним класама. Цео чланак резимира да се апстрактне класе не могу инстанцирати и да не можемо натерати њихове објекте да позивају методе у њему. Испробали смо и различите примере да бисмо направили грешке, а затим решили грешке у нашем коду.