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

Jak wstawić do jakiegoś kontenera obiekty różnych klas?

Object Storage Arubacloud
0 głosów
178 wizyt
pytanie zadane 4 stycznia 2018 w C i C++ przez Philip Bywalec (2,320 p.)
Witajcie

Problem jest następujący:

Mam klasy: jabłko oraz masło, które są klasami pochodnymi z klasy produkt.

Mam stworzyć obiekt "zamówienie", który będzie się składać z wygenerowanych losowo obiektów powyższych klas. Czyli np tablica 10 elementów w której jeden element jest jabłkiem a kilka pozostałych masłem.

Jak to wykonać ? Myślałem, aby użyć vectora, lub listy, lecz tam trzeba deklarować wcześniej typ. A może dopisać konstruktor konwertujący?

2 odpowiedzi

+2 głosów
odpowiedź 4 stycznia 2018 przez obl Maniak (51,280 p.)
wybrane 17 stycznia 2018 przez Philip
 
Najlepsza

Klasa produkt powinna być klasą abstrakcyjną zawierającą metody czysto abstrakcyjne i powinna być dziedziczona przez twoje klasy jabłko i masło. Wtedy to obiekty tych klas możesz przechowywać w kontenerze jako wskaźniki na klasę produkt. Czyli mniej więcej tak:

std::vector<Produkt*> produkty;

produkty.push_back( new Maslo("Masło maślane", 1.50 );

 

3
komentarz 4 stycznia 2018 przez criss Mędrzec (172,590 p.)

Z czegoś takiego się tragicznie ciężko korzysta. Załóżmy, że usuwasz element z kontenera: czy obiekt zostaje zwolniony? Nope - wyciek. Albo kontener wychodzi poza scope i jest niszczony. Wyciek. Za każdym razem przed jakąkolwiek operacją wiążącą się z traceniem elementów vectora musisz jeszcze wołać delete. Masakra logistyczna.

Może lepiej:

std::vector<std::unique_ptr<Produkt>> produkty;
 
produkty.push_back(std::make_unique<Maslo>("Masło maślane", 1.50));

0 głosów
odpowiedź 4 stycznia 2018 przez mokrowski Mędrzec (155,460 p.)

Cóż, ostatnio pojawiło się jeszcze jedno standardowo dostępne rozwiązanie. Jeśli masz nowoczesny kompilator, stosujesz typ std::variant. Wystarczy włączyć nagłówek <variant>. Krótki przykład:

#include <variant>
#include <iostream>

class Apple {
public:
    void info() const {
        std::cout << "I'm apple.\n";
    }
};

class Cherry {
public:
    void info() const {
        std::cout << "I'm cherry.\n";
    }
};

int main() {
    std::variant<Apple, Cherry> table[] = {
        Apple(), Apple(), Cherry(), Apple()
    };
    for(const auto& obj: table) {
        try {
            std::get<Apple>(obj).info();
        } catch(const std::bad_variant_access&) {
            std::get<Cherry>(obj).info();
        }
    }
}

Osobiście wybrał bym rozwiązanie z std::unique_ptr.

Podobne pytania

0 głosów
1 odpowiedź 1,101 wizyt
pytanie zadane 14 lipca 2015 w PHP przez Dronojad Obywatel (1,980 p.)
+3 głosów
3 odpowiedzi 997 wizyt
+1 głos
2 odpowiedzi 653 wizyt

92,595 zapytań

141,444 odpowiedzi

319,717 komentarzy

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

...