Error: no es pot crear una instancia de la classe abstracta

Error No Es Pot Crear Una Instancia De La Classe Abstracta



Aquest article tracta sobre un altre error que sovint es produeix quan treballem amb classes abstractes al nostre codi. Estudiem el concepte de classes abstractes a la Programació Orientada a Objectes. Una classe que no pot tenir cap objecte creat a partir d'ella mateixa es coneix com a classe abstracta. També s'anomena interfície en llenguatge C++. Qualsevol classe es pot fer abstracta en el llenguatge C++ declarant-hi una funció virtual pura. Per declarar una funció virtual, hem de posar '=0' després de la funció. La classe abstracta actua com a classe pare o base de la qual es deriven totes les altres classes fills. Per tant, per accedir a la classe abstracta, l'hem d'heretar de les seves classes base. Quan intentem crear una instancia d'una classe abstracta, obtenim un error de compilació.

Sintaxi

El missatge d'error del nostre error és el següent:

error : no es pot declarar que la variable '' sigui de tipus abstracte ''

Tingueu en compte que entre parèntesis buits hi haurà noms de classe variables i abstractes.







error C2259 : 'Estat' : no pot instància de classe abstracta

Aquest és un altre missatge que rebem del compilador quan ens trobem amb aquest error.



Exemple # 01:

Per fer entenedor aquest error, realitzarem un exemple en el qual escriurem el nostre codi de tal manera que obtinguem un error. Per a això, hem inicialitzat una classe amb el nom 'ShapeClass'. Per fer abstracta aquesta classe, hem declarat una funció virtual amb el nom 'getArea'. També hem declarat dues funcions més amb els noms 'setWidth' i 'setHeight' respectivament. El que volem fer aquí és que volem obtenir l'alçada com a paràmetre i l'amplada com a paràmetre d'entrada. Calcularem l'àrea amb l'ajuda dels nostres paràmetres d'entrada. Hem creat una instància de la nostra classe al mètode principal. Amb l'ajuda d'aquest objecte, hem cridat els mètodes i passarem els paràmetres d'entrada a través d'aquests mètodes. Després d'això, vam imprimir la nostra sortida per comprovar els resultats.



#inclou

utilitzant l'espai de noms std ;
classe ShapeClass
{
públic :
virtual int Getaria ( ) = 0 ;
buit setWidth ( int en )
{
amplada = en ;
}
buit setHeight ( int h )
{
alçada = h ;
}
protegit :
int amplada ;
int alçada ;
} ;
int principal ( buit )
{
ShapeClasssh ;
sh. setWidth ( 1 ) ;
sh. setHeight ( 2 ) ;
cout << 'Àrea total del rectangle:' << sh. Getaria ( ) << endl ;
tornar 0 ;
}

El sistema ens va donar un error després de l'execució del nostre codi. El missatge d'error diu que no podem declarar que la variable 'sh' sigui de tipus abstracte 'shapeclass'. Ara, el compilador intenta transmetre que 'ShapeClass' és un tipus abstracte i no podem declarar la seva variable. Per tant, amb el missatge, podem entendre clarament que el compilador no ens deixa instància de la nostra classe abstracta, per això el sistema ens està donant l'error.





Per resoldre l'error, vam declarar una altra classe 'Rectangle'. Aquesta classe serà la classe secundària de la nostra classe abstracta i declararem el cos de la nostra funció virtual en aquesta classe. Després d'això, crearem el seu objecte en el mètode principal i amb l'ajuda del seu objecte, cridarem les funcions.



Després de les esmenes, vam crear el nostre codi i ara hem tingut èxit en executar el nostre codi. El sistema ha executat el nostre codi sense donar errors. Podem veure a la sortida que el sistema ha calculat l'àrea d'un rectangle i ha imprès la sortida. Hem après que el nostre error va ser que estàvem anomenant directament l'objecte de la nostra classe abstracta que era l'enfocament equivocat. Quan vam cridar l'objecte de la seva classe secundària, el nostre codi va començar a funcionar bé.

Exemple # 02:

En aquest exemple, no farem cap càlcul matemàtic. Aquest exemple és un exemple genèric que ens ajudarà a entendre les classes abstractes i com s'executa el compilador entre els mètodes i les classes mentre s'executa el codi. En aquesta classe, hem creat una classe abstracta i l'hem anomenada 'AbsClass'. Hem declarat una altra classe 'ChildClass', però aquesta no és una classe abstracta. Aquesta classe es deriva de la nostra classe abstracta.

Hem imprès 'Valor passat amb Object' en un mètode declarat a la classe abstracta. El nom de la funció és 'valueFunc'. Com hem comentat, el cos de la funció virtual es declara a la classe infantil. A la nostra classe infantil, hem imprès 'En funció virtual' al nostre cos de funció virtual. Ara, passarem un valor a la nostra funció de valor i veurem si el valor assolit és correcte. En el nostre mètode principal, hem creat una instància de la nostra classe abstracta i amb l'ajuda de la instància, cridarem les nostres funcions virtuals i altres. Ara, executarem el nostre codi.

#inclou

utilitzant l'espai de noms std ;
classe AbsClass
{
públic :
virtual int VirtFunc ( ) = 0 ;
buit valueFunc ( int en )
{
amplada = en ;
cout << 'Valor passat amb Object' << en << endl ;
}
protegit :
int amplada ;
} ;
classe ChildClass :
públic AbsClass
{
públic :
int VirtFunc ( ) {
cout << 'En funció virtual' << endl ;
}
} ;
int principal ( buit )
{
ChildClass cc ;
cc. valueFunc ( 5 ) ;
cout << cc. VirtFunc ( ) << endl ;
tornar 0 ;
}

Després de l'execució del nostre codi, obtindrem un error. Aquest error és bàsicament que no podem crear una instancia d'una classe abstracta que estem intentant fer aquí al nostre mètode principal. Una cosa a tenir en compte aquí és que la variable i el tipus abstracte del nostre missatge s'han canviat.

Ara, intentarem eliminar el nostre error i executar el nostre codi. Per a això, crearem l'objecte de la nostra classe infantil i farem la seva instància. Amb l'ajuda d'aquesta instància, cridarem tant al mètode virtual com a un altre a la nostra classe abstracta. També s'observarà si podem accedir a la funció virtual mitjançant la classe fill o no. Si tenim èxit en fer-ho, podem dir que hem accedit a la classe abstracta utilitzant la seva classe derivada.

En executar el nostre codi, el compilador no ha generat cap error aquesta vegada. En canvi, el sistema ha compilat el nostre codi amb èxit i ens ha donat la sortida. Ara, fem una ullada a la sortida. El sistema ha imprès 'Valor passat amb Object' i '5' al seu contra. Perquè vam passar 5 utilitzant la nostra instància al mètode principal. Després d'això, va imprimir la línia que li vam demanar a la nostra funció virtual.

Conclusió

En aquesta guia, hem comentat els errors crítics amb què es troben els programadors mentre codifiquen i practiquen conceptes orientats a objectes. Aquest tipus d'errors sovint es produeixen quan un programador està tractant amb classes abstractes. Tot l'article resumeix que les classes abstractes no es poden instanciar i no podem fer que els seus objectes cridin mètodes. També vam provar diferents exemples per crear errors i després vam resoldre els errors del nostre codi.