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

Mieszanie dwóch class w jednej talicy.

Object Storage Arubacloud
0 głosów
114 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez Asdef Nowicjusz (150 p.)
edycja 19 kwietnia 2020 przez Asdef
Dostałem zadanie, w którym korzystam z polimorfizmu, mam klasy coś na zasadzie

class player{};

class gracz: player{};

class bot: player{};

i mam zrobić dynamiczną tablicę dla x obiektów gracz i y obiektów bot i nie wiem jak ten problem rozwiązać.

Podkreślam, że mam użyć jednej dynamicznej tablicy dla tych dwóch class.

 

EDIT:

Zdałem sobie sprawę, że to może być na zasadzie tylko

class gracz{};

oraz

class gracz: bot{};

EDIT2:

Ale wtedy nie jest to polimorfizm, więc odpada.
komentarz 19 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)

class player{};

class gracz: player{};

class bot: player{};

i mam zrobić dynamiczną tablicę dla x obiektów pies i y obiektów kot i nie wiem jak ten problem rozwiązać.

Nie pokręciłeś czegoś?

komentarz 19 kwietnia 2020 przez Asdef Nowicjusz (150 p.)
Edytowałem komentarz i przegapiłem, rzeczywiście mój błąd.

2 odpowiedzi

+2 głosów
odpowiedź 19 kwietnia 2020 przez tangarr Mędrzec (154,780 p.)

Możesz to dokonać na kilka sposobów. Przedstawię kilka z nich w kodzie.

#include <iostream>
#include <vector>
#include <memory>

class zwierze
{
public:
    virtual ~zwierze() = default;
    virtual void test ()
    {
        std::cout << "zwierze" << std::endl;
    }

};

class pies:public zwierze
{
public:
    virtual void test ()
    {
        std::cout << "pies" << std::endl;
    }
};

class kot:public zwierze
{
public:
    virtual void test ()
    {
        std::cout << "kot" << std::endl;
    }
};

template <typename T>
void test(const T &tablica, size_t rozmiar) {
    std::cout << "test" << std::endl;
    for (size_t i=0; i<rozmiar; i++)
        tablica[i]->test();
    std::cout << std::endl;
}

int main () {
    // surowa tablica
    // musisz ręcznie zadbać o usunięcie pamięci
    // zaalokowanej dla wszystkich elementów
    // i samej tablicy
    zwierze **tablica1 = new zwierze *[4];
    tablica1[0] = new pies ();
    tablica1[1] = new pies ();
    tablica1[2] = new kot ();
    tablica1[3] = new kot ();
    test(tablica1, 4);
    // zwolnienie pamięci
    for (size_t i=0; i<4; i++)
        delete tablica1[i];
    delete [] tablica1;

    // wektor wskaźników
    // musisz ręcznie zadbać o usunięcie pamięci
    // zaalokowanej dla wszystkich elementów
    std::vector < zwierze * >tablica2;
    tablica2.push_back (new pies ());
    tablica2.push_back (new pies ());
    tablica2.push_back (new kot ());
    tablica2.push_back (new kot ());
    test(tablica2, 4);
    // zwolnienie pamięci
    for (size_t i=0; i<4; i++)
        delete tablica2[i];
    tablica2.clear(); // clear tyko po to, zeby nie trzymac listy nieważnych pointerów

    // tablica wskaźników intelignetnych
    // elementy zostaną usunięte automatycznie podczas
    // ręcznego usuwania tablicy
    std::unique_ptr < zwierze > *tablica3 = new std::unique_ptr < zwierze >[4];
    tablica3[0].reset (new pies ());
    tablica3[1].reset (new pies ());
    tablica3[2].reset (new kot());
    tablica3[3].reset (new kot());
    test(tablica3, 4);
    // zwolnienie pamięci
    delete [] tablica3;

    // wektor wskaźników inteligentnych
    // wszystko zostanie automatycznie usunięte
    std::vector<std::unique_ptr<zwierze>> tablica4;
    tablica4.emplace_back (new pies ());
    tablica4.emplace_back (new pies ());
    tablica4.emplace_back (new kot ());
    tablica4.emplace_back (new kot ());
    test(tablica4, 4);
}

 

komentarz 19 kwietnia 2020 przez Asdef Nowicjusz (150 p.)
Cóż mogę powiedzieć, prawie* nic z tego nie rozumiem i nie spodziewałem się, aż tak dobrej odpowiedzi, dziękuję i ciesze się, że wziąłem się za ten projekt tak wcześnie i mam dłuższą chwilę, aby się tym pobawić.

 

*vektory
komentarz 19 kwietnia 2020 przez tangarr Mędrzec (154,780 p.)
Prawdopodobnie pierwsza forma wystarczy ci w zupełności (na zaliczenia zadania). Jednak w codziennym programowaniu szczerze polecam czwartą.

Jeżeli potrzebujesz rozwinąć jakiś temat to pytaj.
+1 głos
odpowiedź 19 kwietnia 2020 przez XxPPDKxX Obywatel (1,400 p.)
Tworzysz klasę bazową zwierze i klasy pochodne pies, kot, które dziedziczą po tej klasie. Następnie tworzysz dynamiczną tablice obiektów zwierzę. Dzięki temu ,że klasy dziedziczą po niej możesz mieć w tym zarówno klasę pies jak i kot.

Podobne pytania

0 głosów
1 odpowiedź 460 wizyt
pytanie zadane 25 kwietnia 2021 w C i C++ przez Marak123 Stary wyjadacz (11,190 p.)
0 głosów
1 odpowiedź 85 wizyt
pytanie zadane 5 listopada 2020 w C i C++ przez soswi Nowicjusz (120 p.)
0 głosów
3 odpowiedzi 736 wizyt
pytanie zadane 29 kwietnia 2019 w C i C++ przez Dominik Modrzejewski Nowicjusz (140 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...