Error: no se puede crear una instancia de la clase abstracta

Error No Se Puede Crear Una Instancia De La Clase Abstracta



Este artículo trata sobre otro error que ocurre a menudo cuando trabajamos con clases abstractas en nuestro código. Estudiemos el concepto de clases abstractas en Programación Orientada a Objetos. Una clase que no puede tener ningún objeto creado a partir de sí misma se conoce como clase abstracta. También se le llama interfaz en lenguaje C++. Cualquier clase se puede hacer abstracta en lenguaje C++ declarando una función virtual pura en ella. Para declarar una función virtual, tenemos que colocar '=0' después de la función. La clase abstracta actúa como una clase principal o base de la que se derivan todas las demás clases secundarias. Entonces, para acceder a la clase abstracta, debemos heredarla de sus clases base. Cuando intentamos instanciar una clase abstracta, obtenemos un error de compilación.

Sintaxis

El mensaje de error de nuestro error es el siguiente:

error : no se puede declarar la variable ' ' como de tipo abstracto ''

Tenga en cuenta que entre paréntesis vacíos, habrá nombres de clases abstractos y variables.







error C2259 : 'Estado' : no se puede instanciar la clase abstracta

Este es otro mensaje que recibimos del compilador cuando encontramos un error de este tipo.



Ejemplo # 01:

Para que este error sea comprensible, realizaremos un ejemplo en el que escribiremos nuestro código de tal manera que obtengamos un error. Para ello, hemos inicializado una clase con el nombre “ShapeClass”. Para hacer que esta clase sea abstracta, hemos declarado una función virtual en ella con el nombre 'getArea'. También hemos declarado otras dos funciones con los nombres 'setWidth' y 'setHeight' respectivamente. Lo que queremos hacer aquí es obtener la altura como parámetro y el ancho como parámetro de entrada. Calcularemos el área con la ayuda de nuestros parámetros de entrada. Creamos una instancia de nuestra clase en el método principal. Con la ayuda de ese objeto, hemos llamado a los métodos y pasaremos los parámetros de entrada a través de esos métodos. Después de eso, imprimimos nuestra salida para verificar los resultados.



#incluir

usando el espacio de nombres estándar ;
clase ShapeClass
{
público :
virtual En t Guetaria ( ) = 0 ;
      vacío conjuntoAncho ( En t en )
{
ancho = en ;
      }
      vacío establecerAltura ( En t h )
  {
altura = h ;
      }
protegido :
      En t ancho ;
      En t altura ;
} ;
En t principal ( vacío )
{
FormaClasesh ;
sh. conjuntoAncho ( 1 ) ;
sh. establecerAltura ( 2 ) ;
cout << 'Área total del rectángulo: ' << sh. Guetaria ( ) << final ;
devolver 0 ;
}

El sistema nos dio un error luego de la ejecución de nuestro código. El mensaje de error dice que no podemos declarar que la variable 'sh' sea de tipo abstracto 'shapeclass'. Ahora, el compilador intenta transmitir que 'ShapeClass' es un tipo abstracto y no podemos declarar su variable. Entonces, con el mensaje, podemos entender claramente que el compilador no nos permite instanciar nuestra clase abstracta, por eso el sistema nos está dando el error.





Para resolver el error, declaramos otra clase 'Rectángulo'. Esta clase será la clase secundaria de nuestra clase abstracta y declararemos el cuerpo de nuestra función virtual en esta clase. Después de eso, crearemos su objeto en el método principal y con la ayuda de su objeto, llamaremos a las funciones.



Después de las enmiendas, hicimos nuestro código y ahora hemos tenido éxito en ejecutar nuestro código. El sistema ha ejecutado nuestro código sin dar errores. Podemos ver en la salida que el sistema calculó el área de un rectángulo e imprimió la salida. Hemos aprendido que nuestro error fue que estábamos llamando directamente al objeto de nuestra clase abstracta, que era el enfoque incorrecto. Cuando llamamos al objeto de su clase secundaria, nuestro código comenzó a funcionar bien.

Ejemplo # 02:

En este ejemplo, no haremos ningún cálculo matemático. Este ejemplo es un ejemplo genérico que nos ayudará a comprender las clases abstractas y cómo se ejecuta el compilador entre los métodos y las clases mientras ejecuta el código. En esta clase, hemos creado una clase abstracta y la hemos llamado 'AbsClass'. Hemos declarado otra clase 'ChildClass' pero esta no es una clase abstracta. Esta clase se deriva de nuestra clase abstracta.

Hemos impreso 'Valor pasado usando Objeto' en un método declarado en la clase abstracta. El nombre de la función es 'valueFunc'. Como discutimos, el cuerpo de la función virtual se declara en la clase secundaria. En nuestra clase secundaria, hemos impreso 'En función virtual' en el cuerpo de nuestra función virtual. Ahora, pasaremos un valor a nuestra función de valor y veremos si el valor alcanzado es correcto. En nuestro método principal, hemos creado una instancia de nuestra clase abstracta y, con la ayuda de la instancia, llamaremos a nuestras funciones virtuales y otras. Ahora, ejecutaremos nuestro código.

#incluir

usando el espacio de nombres estándar ;
clase AbsClass
  {
público :
virtual En t VirtualFunc ( ) = 0 ;
      vacío valueFunc ( En t en )
{
ancho = en ;
cout << 'Valor pasado usando Objeto' << en << final ;
      }
protegido :
      En t ancho ;
} ;
clase ChildClass :
AbsClass público
{
público :
En t VirtualFunc ( ) {
cout << 'En función virtual' << final ;
      }
} ;
En t principal ( vacío )
{
ChildClass cc ;
CC. valueFunc ( 5 ) ;
cout << CC. VirtualFunc ( ) << final ;
devolver 0 ;
}

Después de la ejecución de nuestro código, obtendremos un error. Este error es básicamente que no podemos instanciar una clase abstracta que estamos tratando de hacer aquí en nuestro método principal. Una cosa a tener en cuenta aquí es que la variable y el tipo abstracto en nuestro mensaje han sido cambiados.

Ahora, intentaremos eliminar nuestro error y ejecutar nuestro código. Para ese propósito, crearemos el objeto de nuestra clase secundaria y haremos su instancia. Con la ayuda de esa instancia, llamaremos tanto al método virtual como a otro método en nuestra clase abstracta. También se observará si podemos acceder a la función virtual usando la clase child o no. Si tenemos éxito al hacerlo, podemos decir que hemos accedido a la clase abstracta utilizando su clase derivada.

Tras la ejecución de nuestro código, el compilador no ha arrojado ningún error esta vez. En cambio, el sistema compiló nuestro código con éxito y nos dio el resultado. Ahora, echemos un vistazo a la salida. El sistema ha impreso 'Valor pasado usando Objeto' y '5' contra él. Porque pasamos 5 usando nuestra instancia en el método principal. Después de eso, imprimió la línea que le pedimos en nuestra función virtual.

Conclusión

En esta guía, analizamos los errores críticos que encuentran los programadores al codificar y practicar conceptos orientados a objetos. Este tipo de errores a menudo ocurren cuando un programador trabaja con clases abstractas. Todo el artículo resume que las clases abstractas no se pueden instanciar, y no podemos hacer que sus objetos llamen métodos en él. También probamos diferentes ejemplos para crear errores y luego resolvimos los errores en nuestro código.