Erreur : Impossible d'instancier la classe abstraite

Erreur Impossible D Instancier La Classe Abstraite



Cet article concerne une autre erreur qui se produit souvent lorsque nous travaillons avec des classes abstraites dans notre code. Étudions le concept de classes abstraites en programmation orientée objet. Une classe qui ne peut pas avoir d'objets créés à partir d'elle-même est appelée classe abstraite. Il est également appelé interface en langage C++. Toute classe peut être rendue abstraite en langage C++ en y déclarant une fonction virtuelle pure. Pour déclarer une fonction virtuelle, nous devons placer '=0' après la fonction. La classe abstraite agit comme une classe parent ou de base à partir de laquelle toutes les autres classes enfants sont dérivées. Ainsi, pour accéder à la classe abstraite, nous devons l'hériter de ses classes de base. Lorsque nous essayons d'instancier une classe abstraite, nous obtenons une erreur de compilation.

Syntaxe

Le message d'erreur de notre erreur est le suivant :

Erreur : ne peut pas déclarer la variable ' ' comme étant de type abstrait ''

Notez qu'entre parenthèses vides, il y aura des noms de classes variables et abstraites.







erreur C2259 : 'État' : impossible d'instancier une classe abstraite

C'est un autre message que nous recevons du compilateur lorsque nous rencontrons une telle erreur.



Exemple #01 :

Pour rendre cette erreur compréhensible, nous allons réaliser un exemple dans lequel nous allons écrire notre code de manière à obtenir une erreur. Pour cela, nous avons initialisé une classe avec le nom 'ShapeClass'. Pour rendre cette classe abstraite, nous y avons déclaré une fonction virtuelle avec le nom 'getArea'. Nous avons également déclaré deux autres fonctions avec les noms 'setWidth' et 'setHeight' respectivement. Ce que nous voulons faire ici, c'est que nous voulons obtenir la hauteur comme paramètre et la largeur comme paramètre d'entrée. Nous allons calculer la surface à l'aide de nos paramètres d'entrée. Nous avons créé une instance de notre classe dans la méthode principale. Avec l'aide de cet objet, nous avons appelé les méthodes et nous passerons les paramètres d'entrée à travers ces méthodes. Après cela, nous avons imprimé notre sortie pour vérifier les résultats.



#include

en utilisant l'espace de noms std ;
classe ShapeClass
{
Publique :
virtuel entier Getaria ( ) = 0 ;
annuler définirLargeur ( entier dans )
{
largeur = dans ;
}
annuler setHeight ( entier h )
{
la taille = h ;
}
protégé :
entier largeur ;
entier la taille ;
} ;
entier principale ( annuler )
{
ShapeClasssh ;
sh. définirLargeur ( 1 ) ;
sh. setHeight ( deux ) ;
écoute << 'Surface totale du rectangle : ' << sh. Getaria ( ) << fin ;
revenir 0 ;
}

Le système nous a donné une erreur après l'exécution de notre code. Le message d'erreur indique que nous ne pouvons pas déclarer la variable 'sh' comme étant de type abstrait 'shapeclass'. Maintenant, le compilateur essaie de transmettre que 'ShapeClass' est un type abstrait et nous ne pouvons pas déclarer sa variable. Ainsi, avec le message, nous pouvons clairement comprendre que le compilateur ne nous laisse pas instancier notre classe abstraite, c'est pourquoi le système nous donne l'erreur.





Pour résoudre l'erreur, nous avons déclaré une autre classe 'Rectangle'. Cette classe sera la classe enfant de notre classe abstraite et nous déclarerons le corps de notre fonction virtuelle dans cette classe. Après cela, nous allons créer son objet dans la méthode principale et à l'aide de son objet, nous appellerons les fonctions.



Après les amendements, nous avons créé notre code et nous avons maintenant réussi à faire fonctionner notre code. Le système a exécuté notre code sans donner d'erreurs. Nous pouvons voir dans la sortie que le système a calculé l'aire d'un rectangle et imprimé la sortie. Nous avons appris que notre erreur était que nous appelions directement l'objet de notre classe abstraite, ce qui était la mauvaise approche. Lorsque nous avons appelé l'objet de sa classe enfant, notre code a commencé à fonctionner correctement.

Exemple #02 :

Dans cet exemple, nous ne ferons aucun calcul mathématique. Cet exemple est un exemple générique qui nous aidera à comprendre les classes abstraites et comment le compilateur s'exécute entre les méthodes et les classes lors de l'exécution du code. Dans cette classe, nous avons créé une classe abstraite et l'avons nommée 'AbsClass'. Nous avons déclaré une autre classe 'ChildClass' mais celle-ci n'est pas une classe abstraite. Cette classe est dérivée de notre classe abstraite.

Nous avons imprimé 'Valeur passée en utilisant Object' dans une méthode déclarée dans la classe abstraite. Le nom de la fonction est 'valueFunc'. Comme nous l'avons vu, le corps de la fonction virtuelle est déclaré dans la classe enfant. Dans notre classe enfant, nous avons imprimé 'Dans la fonction virtuelle' dans notre corps de fonction virtuelle. Maintenant, nous allons passer une valeur à notre fonction de valeur et voir si la valeur atteinte est correcte. Dans notre méthode principale, nous avons créé une instance de notre classe abstraite et avec l'aide de l'instance, nous appellerons nos fonctions virtuelles et autres. Maintenant, nous allons exécuter notre code.

#include

en utilisant l'espace de noms std ;
classe AbsClass
{
Publique :
virtuel entier VirtFunc ( ) = 0 ;
annuler valeurFonction ( entier dans )
{
largeur = dans ;
écoute << 'Valeur transmise à l'aide de l'objet' << dans << fin ;
}
protégé :
entier largeur ;
} ;
classe ChildClass :
Classe Abs publique
{
Publique :
entier VirtFunc ( ) {
écoute << 'En fonction virtuelle' << fin ;
}
} ;
entier principale ( annuler )
{
ChildClass cc ;
cc. valeurFonction ( 5 ) ;
écoute << cc. VirtFunc ( ) << fin ;
revenir 0 ;
}

Après l'exécution de notre code, nous aurons une erreur. Cette erreur est essentiellement que nous ne pouvons pas instancier une classe abstraite que nous essayons de faire ici dans notre méthode principale. Une chose à noter ici est que la variable et le type abstrait de notre message ont été modifiés.

Maintenant, nous allons essayer de supprimer notre erreur et d'exécuter notre code. Pour cela, nous allons créer l'objet de notre classe enfant et en faire son instance. Avec l'aide de cette instance, nous appellerons à la fois la méthode virtuelle et une autre méthode dans notre classe abstraite. On observera également si l'on peut accéder à la fonction virtuelle en utilisant la classe enfant ou non. Si nous y parvenons, nous pouvons dire que nous avons accédé à la classe abstraite en utilisant sa classe dérivée.

Lors de l'exécution de notre code, le compilateur n'a cette fois pas renvoyé d'erreur. Au lieu de cela, le système a compilé notre code avec succès et nous a donné la sortie. Maintenant, regardons la sortie. Le système a imprimé 'Valeur transmise à l'aide de l'objet' et '5' en regard. Parce que nous avons passé 5 en utilisant notre instance dans la méthode principale. Après cela, il a imprimé la ligne que nous lui avons demandée dans notre fonction virtuelle.

Conclusion

Dans ce guide, nous avons discuté des erreurs critiques rencontrées par les programmeurs lors du codage et de la pratique de concepts orientés objet. Ces types d'erreurs se produisent souvent lorsqu'un programmeur traite des classes abstraites. L'ensemble de l'article résume que les classes abstraites ne peuvent pas être instanciées et que nous ne pouvons pas faire en sorte que leurs objets appellent des méthodes. Nous avons également essayé différents exemples pour créer des erreurs, puis avons résolu les erreurs dans notre code.