• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Klasa abstrakcyjna

Object Storage Arubacloud
0 głosów
335 wizyt
pytanie zadane 12 czerwca 2017 w C i C++ przez Akiro Bywalec (2,910 p.)

Mój problem jest bardzo prosty do wytłumaczenia, otóż spójrzmy najpierw na kawałek kodu" 

int rodzaj; 
cin >> rodzaj;
cAbstrakcyjna *wsk;


if (rodzaj==1)
{
    cWypozyczalnia g1;
    wsk= &g1;
}
if (rodzaj==2)
{
    cWypozyczalnia2 x1;
    wsk= &x1;
}
else
{
    cout << "Nieprawidlowy numer opcji, wpisz ponownie: ";
    cin>>rodzaj;
}

Otóż w mainie do klasy abstrakcyjnej utworzyłem wskaźnik. Mam dwie dziedziczne klasy i chce w zależności od wpisanej na klawiaturze liczbie - tworzyć obiekty i przypisywać im te wskaźniki. 

Problem jest taki: użytkownik podaje wartość 2 do zmiennej rodzaj - program działa, uruchamia wszystkie opcje które chce i jest elegancko. Problem jest gdy poda 1, wtedy kompilator nie wyświetla funkcji, które akurat tworzyłem i odpala się warunek else. Najlepsze jest to, że gdy wpisze 0 to wtedy wyświetla zawartość, którą chcę. 

Tu podaje instrukcje, które mają się wywołać: 

 do
    {
            wsk->WyswietlKoszyk();


        cout << "TWOJ KOSZYK, WYBIERZ INTERESUJACA CIE OPERACJE:"<<endl;
        cout << "------------------------------------------"<<endl;
        cout << "1. Dodaj gre do koszyka "<<endl;
        cout << "2. Usun gre z koszyka "<<endl;
        cout << "3. Sprawdz ile gier masz w koszyku "<<endl;
        cout << "4. Sprawdz czy Twoj koszyk jest pusty "<<endl;
        cout << "5. Wyjdz z programu "<<endl;
        cout << "------------------------------------------"<<endl;
        cout << "Wybor: ";
        cin >> wybor;

        switch (wybor)
        {
        case 1:
            wsk->DodajGre();
            break;

        case 2:
            wsk->UsunGre();
            break;

        case 3:
            wsk->LiczbaGier();
            break;

        case 4:
            wsk->PustyKoszyk();
            break;
        }

    }
    while (wybor != 5);

 

2 odpowiedzi

+1 głos
odpowiedź 12 czerwca 2017 przez Michał Kazula Pasjonat (19,540 p.)
wybrane 12 czerwca 2017 przez Akiro
 
Najlepsza
Z tego co mnie uczono to nie można używać klasy abstrakcyjnej jako obiektu. Dlatego nazywa się abstrakcyjna. Inaczej mówiąc jest to tylko szablon/zarys etap wyjściowy do tworzenia klas pochodnych. Taka część wspólna.

Utwórz sobie klasę dziedziczącą po klasie abstrakcyjnej i daj wskaźnik do tej klasy.
komentarz 12 czerwca 2017 przez Akiro Bywalec (2,910 p.)
No a co ja zrobiłem, mam utworzone 2 klasy, które dziedziczą z tej abstrakcyjnej.

W klasie abstrakcyjnej ustawiam tylko funkcje wirtualne oraz tworze wskaźnik w mainie.
komentarz 12 czerwca 2017 przez Michał Kazula Pasjonat (19,540 p.)
Chodzi Ci o: cWypozyczalnia  i cWypozyczalnia2? A pokaż mi jak tworzysz te klasy.
komentarz 12 czerwca 2017 przez Akiro Bywalec (2,910 p.)
class cWypozyczalnia2 :public cAbstrakcyjna //klasa dziedziczna z lista dziedziczenia
{
    public:
        cWypozyczalnia2(int mIle, int mGlowa, int mOgon);
        virtual void WyswietlKoszyk();
        virtual void DodajGre();
        virtual void UsunGre();
        virtual void LiczbaGier();
        virtual void PustyKoszyk();

};

No i wiadomo, poniżej mam funkcje typu void DodajGre::cWypozyczalnia2() i różne instrukcje 

 

komentarz 12 czerwca 2017 przez Akiro Bywalec (2,910 p.)

Analogicznie wygląda cWypozyczalnia

 

A jeszcze dodam, jak utworzyłem klase abstrakcyjną 

class cAbstrakcyjna
{
    protected:
    int mDane[10];
    int mIle;
    int mGlowa;
    int mOgon;

    public:
    virtual void WyswietlKoszyk()=0;
    virtual void DodajGre()=0;
    virtual void UsunGre()=0;
    virtual void LiczbaGier()=0;
    virtual void PustyKoszyk()=0;
};

 

komentarz 12 czerwca 2017 przez Michał Kazula Pasjonat (19,540 p.)

Zrób tak:

 cWypozyczalnia g1;
cWypozyczalnia2 x1;
if (rodzaj==1)
{
    wsk= &g1;
}
if (rodzaj==2)
{   
    wsk= &x1;
}

PS 

Zamień if na switch :-)

komentarz 12 czerwca 2017 przez Akiro Bywalec (2,910 p.)
Dziękuje za szybką reakcje, działa faktycznie :)

A mogę wiedzieć na przyszłość dlaczego takie coś nie działa na if'ie?
komentarz 12 czerwca 2017 przez Michał Kazula Pasjonat (19,540 p.)
W if'ie tworzysz obiekt, instancje do klasy lokalnie. Klamerki if'a ograniczają pole zasięgu takiej zmiennej.
+2 głosów
odpowiedź 12 czerwca 2017 przez unknown Nałogowiec (39,560 p.)
Po wykonaniu kodu z if'a obiekt na który wskazuję wsk przestaje istnieć.
komentarz 12 czerwca 2017 przez Michał Kazula Pasjonat (19,540 p.)
Potwierdzam.
komentarz 12 czerwca 2017 przez Akiro Bywalec (2,910 p.)

No dobra, ale jak wyciągnę te instrukcje do tworzenia obiektów z if'a i zostawie w nim tylko 

cAbstrakcyjna *wsk;
cWypozyczalnia g1;
cWypozyczalnia2 x1;


if (rodzaj==1)
{
    wsk= &g1;
}
if (rodzaj==2)
{

    wsk= &x1;
}

 

To też nie działa 

komentarz 12 czerwca 2017 przez unknown Nałogowiec (39,560 p.)
Pokaż trochę więcej kodu.
komentarz 12 czerwca 2017 przez Akiro Bywalec (2,910 p.)
Już problem został rozwiązany. W każdym razie dziękuje za błyskawiczne zainteresowanie, pozdrawiam :)

Podobne pytania

0 głosów
1 odpowiedź 211 wizyt
pytanie zadane 27 marca 2017 w C i C++ przez Prg Użytkownik (580 p.)
0 głosów
1 odpowiedź 485 wizyt
pytanie zadane 31 lipca 2018 w PHP przez Adam Ostrogórski Obywatel (1,070 p.)
+1 głos
1 odpowiedź 164 wizyt

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...