Errore: impossibile istanziare la classe astratta

Errore Impossibile Istanziare La Classe Astratta



Questo articolo riguarda un altro errore che si verifica spesso quando lavoriamo con classi astratte nel nostro codice. Studiamo il concetto di classi astratte nella programmazione orientata agli oggetti. Una classe che non può avere alcun oggetto creato da se stessa è nota come classe astratta. È anche chiamata interfaccia in linguaggio C++. Qualsiasi classe può essere resa astratta nel linguaggio C++ dichiarando una pura funzione virtuale al suo interno. Per dichiarare una funzione virtuale, dobbiamo inserire '=0' dopo la funzione. La classe astratta funge da genitore o classe base da cui derivano tutte le altre classi figlie. Quindi, per accedere alla classe astratta, dobbiamo ereditarla dalle sue classi base. Quando proviamo a istanziare una classe astratta, otteniamo un errore di compilazione.

Sintassi

Il messaggio di errore del nostro errore è il seguente:

errore : non può dichiarare la variabile '' come di tipo astratto ''

Si noti che tra parentesi vuote ci saranno nomi di variabili e classi astratte.







errore C2259 : 'Stato' : non può istanziare una classe astratta

Questo è un altro messaggio che riceviamo dal compilatore quando incontriamo un tale errore.



Esempio n. 01:

Per rendere comprensibile questo errore, eseguiremo un esempio in cui scriveremo il nostro codice in modo tale da ottenere un errore. A tale scopo, abbiamo inizializzato una classe con il nome 'ShapeClass'. Per rendere astratta questa classe, abbiamo dichiarato al suo interno una funzione virtuale con il nome “getArea”. Abbiamo dichiarato anche altre due funzioni con i nomi rispettivamente 'setWidth' e 'setHeight'. Quello che vogliamo fare qui è che vogliamo ottenere l'altezza come parametro e la larghezza come parametro di input. Calcoleremo l'area con l'aiuto dei nostri parametri di input. Abbiamo creato un'istanza della nostra classe nel metodo principale. Con l'aiuto di quell'oggetto, abbiamo chiamato i metodi e passeremo i parametri di input attraverso quei metodi. Successivamente, abbiamo stampato il nostro output per controllare i risultati.



#include

utilizzando lo spazio dei nomi std ;
classe ShapeClass
{
pubblico :
virtuale int Getaria ( ) = 0 ;
vuoto setWidth ( int in )
{
larghezza = in ;
}
vuoto setAltezza ( int h )
{
altezza = h ;
}
protetto :
int larghezza ;
int altezza ;
} ;
int principale ( vuoto )
{
ShapeClasssh ;
sh. setWidth ( 1 ) ;
sh. setAltezza ( Due ) ;
cout << 'Area totale del rettangolo: ' << sh. Getaria ( ) << finel ;
Restituzione 0 ;
}

Il sistema ci ha dato un errore dopo l'esecuzione del nostro codice. Il messaggio di errore dice che non possiamo dichiarare la variabile 'sh' come di tipo astratto 'shapeclass'. Ora, il compilatore sta cercando di comunicare che 'ShapeClass' è un tipo astratto e non possiamo dichiarare la sua variabile. Quindi, con il messaggio, possiamo capire chiaramente che il compilatore non ci consente di istanziare la nostra classe astratta, ecco perché il sistema ci sta dando l'errore.





Per risolvere l'errore, abbiamo dichiarato un'altra classe 'Rectangle'. Questa classe sarà la classe figlia della nostra classe astratta e dichiareremo il corpo della nostra funzione virtuale in questa classe. Successivamente, creeremo il suo oggetto nel metodo principale e con l'aiuto del suo oggetto chiameremo le funzioni.



Dopo le modifiche, abbiamo creato il nostro codice e ora siamo riusciti a eseguirlo con successo. Il sistema ha eseguito il nostro codice senza dare errori. Possiamo vedere nell'output che il sistema ha calcolato l'area di un rettangolo e stampato l'output. Abbiamo imparato che il nostro errore era che stavamo chiamando direttamente l'oggetto della nostra classe astratta che era l'approccio sbagliato. Quando abbiamo chiamato l'oggetto della sua classe figlia, il nostro codice ha iniziato a funzionare correttamente.

Esempio n. 02:

In questo esempio, non eseguiremo calcoli matematici. Questo esempio è un esempio generico che ci aiuterà a comprendere le classi astratte e come il compilatore viene eseguito tra i metodi e le classi durante l'esecuzione del codice. In questa classe, abbiamo creato una classe astratta e l'abbiamo chiamata 'AbsClass'. Abbiamo dichiarato un'altra classe 'ChildClass' ma questa non è una classe astratta. Questa classe è derivata dalla nostra classe astratta.

Abbiamo stampato 'Valore passato usando Object' in un metodo dichiarato nella classe astratta. Il nome della funzione è “valueFunc”. Come abbiamo discusso, il corpo della funzione virtuale è dichiarato nella classe figlia. Nella nostra classe child, abbiamo stampato 'In virtual function' nel nostro corpo della funzione virtuale. Ora passeremo un valore alla nostra funzione valore e vedremo se il valore raggiunto è corretto. Nel nostro metodo principale, abbiamo creato un'istanza della nostra classe astratta e con l'aiuto dell'istanza chiameremo le nostre funzioni virtuali e di altro tipo. Ora eseguiremo il nostro codice.

#include

utilizzando lo spazio dei nomi std ;
classe AbsClass
{
pubblico :
virtuale int VirtFunc ( ) = 0 ;
vuoto valoreFunz ( int in )
{
larghezza = in ;
cout << 'Valore passato utilizzando Object' << in << finel ;
}
protetto :
int larghezza ;
} ;
classe FiglioClasse :
public AbsClass
{
pubblico :
int VirtFunc ( ) {
cout << 'In funzione virtuale' << finel ;
}
} ;
int principale ( vuoto )
{
BambinoClasse cc ;
cc. valoreFunz ( 5 ) ;
cout << cc. VirtFunc ( ) << finel ;
Restituzione 0 ;
}

Dopo l'esecuzione del nostro codice, riceveremo un errore. Questo errore è fondamentalmente che non possiamo istanziare una classe astratta che stiamo cercando di fare qui nel nostro metodo principale. Una cosa da notare qui è che la variabile e il tipo astratto nel nostro messaggio sono stati cambiati.

Ora proveremo a rimuovere il nostro errore ed eseguire il nostro codice. A tale scopo, creeremo l'oggetto della nostra classe figlia e creeremo la sua istanza. Con l'aiuto di quell'istanza, chiameremo sia il metodo virtuale che un altro nella nostra classe astratta. Si osserverà anche se possiamo accedere alla funzione virtuale utilizzando o meno la classe figlia. Se riusciamo a farlo, possiamo dire che abbiamo avuto accesso alla classe astratta usando la sua classe derivata.

All'esecuzione del nostro codice, questa volta il compilatore non ha generato alcun errore. Invece, il sistema ha compilato il nostro codice con successo e ci ha fornito l'output. Ora diamo un'occhiata all'output. Il sistema ha stampato 'Valore passato usando Oggetto' e '5' contro di esso. Perché abbiamo passato 5 usando la nostra istanza nel metodo principale. Successivamente, ha stampato la riga che gli avevamo chiesto nella nostra funzione virtuale.

Conclusione

In questa guida, abbiamo discusso degli errori critici che i programmatori incontrano durante la codifica e la pratica dei concetti orientati agli oggetti. Questi tipi di errori si verificano spesso quando un programmatore ha a che fare con classi astratte. L'intero articolo riassume che le classi astratte non possono essere istanziate e non possiamo fare in modo che i loro oggetti chiamino metodi in esso. Abbiamo anche provato diversi esempi per creare errori e poi li abbiamo risolti nel nostro codice.