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

Klasa abstrakcyjna

VPS Starter Arubacloud
0 głosów
374 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ź 246 wizyt
pytanie zadane 27 marca 2017 w C i C++ przez Prg Użytkownik (580 p.)
0 głosów
1 odpowiedź 780 wizyt
pytanie zadane 31 lipca 2018 w PHP przez Adam Ostrogórski Obywatel (1,070 p.)
+1 głos
1 odpowiedź 182 wizyt

93,030 zapytań

141,992 odpowiedzi

321,293 komentarzy

62,377 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...