[C++] error C2259: cannot instantiate abstract class
Ostatnio zmodyfikowano 2014-11-01 01:08
Atexor Temat założony przez niniejszego użytkownika |
[C++] error C2259: cannot instantiate abstract class » 2014-10-31 23:26:57 Witam, Mam pewien problem z polimorfizmem, a na który nie potrafię znaleźć "działającej" odpowiedzi w internecie. Do napisania mam program "systemu kilku typów bankomatów" (wpłać, wypłać, sprawdź stan konta etc.) z wykorzystaniem dziedziczenia i funkcji wirtualnych. Do tego celu stworzyłem plik-klasę: klasa.wirtualna.h #pragma once class abstrakcyjna_klasa { public: abstrakcyjna_klasa( void ); ~abstrakcyjna_klasa( void ); virtual int jaki_limit() = 0; virtual int wyplac() = 0; virtual int sprawdz_pin() = 0; virtual int wyswietl_saldo() = 0; };
Następnie plik-klasę bankomatu podstawowego: podstawowy.h #pragma once #ifndef _PODSTAWOWY #define _PODSTAWOWY
#include <iostream> #include "abstrakcyjna_klasa.h"
using namespace std;
class podstawowy : public abstrakcyjna_klasa { protected: int saldo; int licznik_limit, limit_bankomatu; bool zablokowany; public: podstawowy( void ); ~podstawowy( void ); virtual int jaki_limit(); virtual int wyplac( int kwota_bp ); virtual int sprawdz_pin( string kod_pin_kl ); void ServiceInfo(); };
#endif
oraz normalnego (który dziedziczy z podstawowego): normalny.h #pragma once #ifndef _NORMALNY #define _NORMALNY
#include <iostream> #include "podstawowy.h" #include "abstrakcyjna_klasa.h"
using namespace std;
class normalny : public podstawowy { protected: int licznik_limit, limit_bankomatu; public: virtual int wyswietl_saldo(); virtual int jaki_limit(); normalny( void ); ~normalny( void ); };
#endif
Zaś w funkcji main chcę stworzyć konkretne obiekty tych klas: podstawowy bankomat_PODST; normalny bankomat_NORM;
Visual Studio podkreśla te 2 obiekty twierdząc, że nie można stworzyć obiektu klasy abstrakcyjnej. Otrzymuję takie błędy kompilacji: 1>c:\users\atexor\documents\visual studio 2010\projects\lab 4\lab 4\main.cpp(24): error C2259: 'podstawowy' : cannot instantiate abstract class 1> due to following members: 1> 'int abstrakcyjna_klasa::wyplac(void)' : is abstract 1> c:\users\atexor\documents\visual studio 2010\projects\lab 4\lab 4\abstrakcyjna_klasa.h(8) : see declaration of 'abstrakcyjna_klasa::wyplac' 1> 'int abstrakcyjna_klasa::sprawdz_pin(void)' : is abstract 1> c:\users\atexor\documents\visual studio 2010\projects\lab 4\lab 4\abstrakcyjna_klasa.h(9) : see declaration of 'abstrakcyjna_klasa::sprawdz_pin' 1> 'int abstrakcyjna_klasa::wyswietl_saldo(void)' : is abstract 1> c:\users\atexor\documents\visual studio 2010\projects\lab 4\lab 4\abstrakcyjna_klasa.h(10) : see declaration of 'abstrakcyjna_klasa::wyswietl_saldo' 1>c:\users\atexor\documents\visual studio 2010\projects\lab 4\lab 4\main.cpp(25): error C2259: 'normalny' : cannot instantiate abstract class 1> due to following members: 1> 'int abstrakcyjna_klasa::wyplac(void)' : is abstract 1> c:\users\atexor\documents\visual studio 2010\projects\lab 4\lab 4\abstrakcyjna_klasa.h(8) : see declaration of 'abstrakcyjna_klasa::wyplac' 1> 'int abstrakcyjna_klasa::sprawdz_pin(void)' : is abstract 1> c:\users\atexor\documents\visual studio 2010\projects\lab 4\lab 4\abstrakcyjna_klasa.h(9) : see declaration of 'abstrakcyjna_klasa::sprawdz_pin'
Co jest tego powodem i jak to naprawić? Jakby co, to klasy podstawowy/normalny mają ciała funkcji w .cpp Bardzo prosiłbym o pomoc. Z góry dziękuję :) |
|
DejaVu |
» 2014-10-31 23:48:11 Masz metody wirtualne, które nie posiadają implementacji. |
|
Atexor Temat założony przez niniejszego użytkownika |
» 2014-11-01 00:02:34 Jak nie posiadają implementacji? Nie do końca rozumiem.
Do tworzenia metod wirtualnych wzorowałem się m.in. kursem tutaj na cpp0x oraz przykładem pana Mirosława Zelenta z jego kursu obietkówki: http://pastebin.com/AqEx6f0z
W kursie na cpp0x jest napisane: "Jeżeli klasa pochodna nie przesłoni wszystkich metod czysto wirtualnych, również jest klasą abstrakcyjną. Nie można utworzyć obiektów klasy abstrakcyjnej."
Zakomentowałem "virtual int wyswietl_saldo()=0;" i metody w pliku "podstawowyh" przysłaniają metody wirtualne z klasy abstrakcyjnej, zaś jak pisałem odpowiednie ciała tych metod są w plikach cpp... Mimo to nadal są błędy kompilacji. |
|
Monika90 |
» 2014-11-01 00:12:07 virtual int wyplac() = 0; virtual int sprawdz_pin() = 0; virtual int wyswietl_saldo() = 0;
virtual int wyplac( int kwota_bp ); virtual int sprawdz_pin( string kod_pin_kl );
chyba widzisz że to nie to samo, bo parametry funkcji są inne. A wyswietl_saldo(); brakuje w ogóle. |
|
Atexor Temat założony przez niniejszego użytkownika |
» 2014-11-01 00:53:11 Faktycznie, już naprawione i działa. Dziękuję bardzo.
Jednakże jeśli mógłbym jeszcze zapytać - jak mógłbym w klasie pochodnej odczytywać wartości od klasy-rodzica? Otóż bankomat "podstawowy" ze względu na metody w nim zawarte (wypłacanie pieniędzy) ma zawierać zmienną "saldo", jednak metoda wyświetlania salda ma być w bankomacie "normalny".
Przykład: zakładam, że początkowe saldo wynosi 5000 zł. Z podstawowego wyjmuję 50 zł, a sprawdzając stan konta w normalnym mam nadal 5000 (dlatego że jest to wartość pobrana przy inicjalizacji klasy). Próbowałem się odwoływać operatorem zasięgu (podstawowy::saldo), ale nadal pokazuje 5000. |
|
DejaVu |
» 2014-11-01 01:08:54 Temat dotyczył błędu kompilacji, a nie rozważań na temat 'czegoś tam'. Jeden temat = jeden problem. Załóż proszę osobny temat jeżeli coś konkretnego Cię interesuje (i nazwij go przyzwoicie). |
|
« 1 » |