Błąd: nie można utworzyć instancji klasy abstrakcyjnej

Blad Nie Mozna Utworzyc Instancji Klasy Abstrakcyjnej



Ten artykuł dotyczy innego błędu, który często występuje podczas pracy z klasami abstrakcyjnymi w naszym kodzie. Przyjrzyjmy się koncepcji klas abstrakcyjnych w programowaniu obiektowym. Klasa, która nie może mieć żadnych obiektów utworzonych z samej siebie, jest nazywana klasą abstrakcyjną. Jest również nazywany interfejsem w języku C++. Każdą klasę można uczynić abstrakcyjną w języku C++, deklarując w niej czystą funkcję wirtualną. Aby zadeklarować funkcję wirtualną, musimy po funkcji umieścić „=0”. Klasa abstrakcyjna działa jako klasa nadrzędna lub klasa bazowa, od której wywodzą się wszystkie inne klasy potomne. Tak więc, aby uzyskać dostęp do klasy abstrakcyjnej, musimy ją odziedziczyć po jej klasach bazowych. Kiedy próbujemy utworzyć instancję klasy abstrakcyjnej, pojawia się błąd kompilacji.

Składnia

Komunikat o błędzie naszego błędu jest następujący:

błąd : nie może zadeklarować, że zmienna „ ” jest typu abstrakcyjnego „”

Zauważ, że w pustych nawiasach będą nazwy klas zmiennych i abstrakcyjnych.







błąd C2259 : 'Państwo' : nie może utworzyć instancji klasy abstrakcyjnej

To kolejny komunikat, który otrzymujemy od kompilatora, gdy napotkamy taki błąd.



Przykład nr 01:

Aby ten błąd był zrozumiały, wykonamy przykład, w którym napiszemy nasz kod w taki sposób, że otrzymamy błąd. W tym celu zainicjowaliśmy klasę o nazwie „ShapeClass”. Aby uczynić tę klasę abstrakcyjną, zadeklarowaliśmy w niej funkcję wirtualną o nazwie „getArea”. Zadeklarowaliśmy również dwie inne funkcje o nazwach odpowiednio „setWidth” i „setHeight”. Chcemy tutaj uzyskać wysokość jako parametr i szerokość jako parametr wejściowy. Będziemy obliczać powierzchnię za pomocą naszych parametrów wejściowych. Stworzyliśmy instancję naszej klasy w metodzie main. Za pomocą tego obiektu wywołaliśmy metody i przez te metody przekażemy parametry wejściowe. Następnie wydrukowaliśmy nasze wyniki, aby sprawdzić wyniki.



#include

przy użyciu przestrzeni nazw std ;
klasa KształtKlasa
{
publiczny :
wirtualny int Getaria ( ) = 0 ;
próżnia Ustaw szerokość ( int w )
{
szerokość = w ;
}
próżnia ustaw wysokość ( int h )
{
wzrost = h ;
}
chroniony :
int szerokość ;
int wzrost ;
} ;
int Główny ( próżnia )
{
ShapeClasssh ;
cii. Ustaw szerokość ( 1 ) ;
cii. ustaw wysokość ( dwa ) ;
cout << „Całkowity obszar prostokąta:” << cii. Getaria ( ) << koniec ;
zwrócić 0 ;
}

System dał nam błąd po wykonaniu naszego kodu. Komunikat o błędzie mówi, że nie możemy zadeklarować zmiennej „sh” jako typu abstrakcyjnego „shapeclass”. Teraz kompilator próbuje przekazać, że „ShapeClass” jest typem abstrakcyjnym i nie możemy zadeklarować jego zmiennej. Dzięki temu komunikatowi możemy jasno zrozumieć, że kompilator nie pozwala nam utworzyć instancji naszej klasy abstrakcyjnej, dlatego system zgłasza nam błąd.





Aby rozwiązać ten błąd, zadeklarowaliśmy inną klasę „Rectangle”. Ta klasa będzie klasą potomną naszej klasy abstrakcyjnej i będziemy deklarować ciało naszej funkcji wirtualnej w tej klasie. Następnie utworzymy jego obiekt w metodzie main i za jego pomocą wywołamy funkcje.



Po poprawkach stworzyliśmy nasz kod i udało nam się uruchomić nasz kod. System wykonał nasz kod bez błędów. Na wyjściu widzimy, że system obliczył pole prostokąta i wydrukował wynik. Dowiedzieliśmy się, że naszym błędem było bezpośrednie wywołanie obiektu naszej klasy abstrakcyjnej, co było niewłaściwym podejściem. Kiedy wywołaliśmy obiekt jego klasy potomnej, nasz kod zaczął działać poprawnie.

Przykład nr 02:

W tym przykładzie nie będziemy wykonywać żadnych obliczeń matematycznych. Ten przykład jest ogólnym przykładem, który pomoże nam zrozumieć klasy abstrakcyjne i sposób, w jaki kompilator działa między metodami i klasami podczas wykonywania kodu. W tej klasie stworzyliśmy klasę abstrakcyjną i nazwaliśmy ją „AbsClass”. Zadeklarowaliśmy kolejną klasę „ChildClass”, ale ta nie jest klasą abstrakcyjną. Ta klasa wywodzi się z naszej klasy abstrakcyjnej.

Wypisaliśmy „Wartość przekazana za pomocą obiektu” w metodzie zadeklarowanej w klasie abstrakcyjnej. Nazwa funkcji to „valueFunc”. Jak już mówiliśmy, ciało funkcji wirtualnej jest zadeklarowane w klasie potomnej. W naszej klasie potomnej wydrukowaliśmy „W funkcji wirtualnej” w treści naszej funkcji wirtualnej. Teraz przekażemy wartość do naszej funkcji wartości i sprawdzimy, czy osiągnięta wartość jest poprawna. W naszej głównej metodzie stworzyliśmy instancję naszej klasy abstrakcyjnej i za jej pomocą będziemy wywoływać nasze funkcje wirtualne i inne. Teraz wykonamy nasz kod.

#include

przy użyciu przestrzeni nazw std ;
klasa AbsKlasa
{
publiczny :
wirtualny int Funkcja Virt ( ) = 0 ;
próżnia wartośćFunkcja ( int w )
{
szerokość = w ;
cout << „Wartość przekazywana za pomocą obiektu” << w << koniec ;
}
chroniony :
int szerokość ;
} ;
klasa DzieckoKlasa :
publiczna AbsClass
{
publiczny :
int Funkcja Virt ( ) {
cout << „W funkcji wirtualnej” << koniec ;
}
} ;
int Główny ( próżnia )
{
Klasa podrzędna cc ;
cc. wartośćFunkcja ( 5 ) ;
cout << cc. Funkcja Virt ( ) << koniec ;
zwrócić 0 ;
}

Po wykonaniu naszego kodu otrzymamy błąd. Ten błąd polega zasadniczo na tym, że nie możemy utworzyć instancji klasy abstrakcyjnej, którą próbujemy zrobić tutaj w naszej głównej metodzie. Należy zauważyć, że zmienna i typ abstrakcji w naszej wiadomości zostały zmienione.

Teraz spróbujemy usunąć nasz błąd i wykonać nasz kod. W tym celu stworzymy obiekt naszej klasy potomnej i utworzymy jego instancję. Za pomocą tej instancji wywołamy zarówno metodę virtual, jak i inną w naszej klasie abstrakcyjnej. Zostanie również zaobserwowane, czy możemy uzyskać dostęp do funkcji wirtualnej za pomocą klasy potomnej, czy nie. Jeśli nam się to uda, możemy powiedzieć, że uzyskaliśmy dostęp do klasy abstrakcyjnej za pomocą jej klasy pochodnej.

Po wykonaniu naszego kodu kompilator tym razem nie zgłosił żadnego błędu. Zamiast tego system pomyślnie skompilował nasz kod i dał nam dane wyjściowe. A teraz spójrzmy na dane wyjściowe. System wydrukował na nim „Wartość przekazana za pomocą obiektu” i „5”. Ponieważ minęliśmy 5 używając naszej instancji w metodzie main. Następnie wydrukował wiersz, o który go poprosiliśmy w naszej funkcji wirtualnej.

Wniosek

W tym przewodniku omówiliśmy krytyczne błędy, które programiści napotykają podczas kodowania i ćwiczenia koncepcji zorientowanych obiektowo. Tego typu błędy często występują, gdy programista ma do czynienia z klasami abstrakcyjnymi. Cały artykuł podsumowuje, że klas abstrakcyjnych nie można tworzyć instancji i nie możemy sprawić, by ich obiekty wywoływały w nim metody. Wypróbowaliśmy również różne przykłady tworzenia błędów, a następnie rozwiązaliśmy błędy w naszym kodzie.