Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] error C2259: cannot instantiate abstract class

Ostatnio zmodyfikowano 2014-11-01 01:08
Autor Wiadomość
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
C/C++
#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
C/C++
#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
C/C++
#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:
C/C++
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ę :)
P-119782
DejaVu
» 2014-10-31 23:48:11
Masz metody wirtualne, które nie posiadają implementacji.
P-119784
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.
P-119785
Monika90
» 2014-11-01 00:12:07
C/C++
virtual int wyplac() = 0;
virtual int sprawdz_pin() = 0;
virtual int wyswietl_saldo() = 0;

C/C++
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.
P-119786
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.
P-119788
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).
P-119789
« 1 »
  Strona 1 z 1