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

question-closed Funkcja wirtualna składnika klasy

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
187 wizyt
pytanie zadane 4 września 2020 w C i C++ przez sebaaas Początkujący (350 p.)
zamknięte 29 września 2020 przez sebaaas

Panie i Panowie, gdzie robię błąd?
Hierarchia klas:
Employee (abstrakcyjna) <- White_collar <- Trader 
Tool (abstrakcyjna) <- Phone
Tool (abstrakcyjna) <- Car
Mam w klasie Employee std::vector<Tool*> employee_tools;

W klasie White_collar:

void complete_equipment() override {
        Phone p(123456789);
        employee_tools.push_back(&p);
        Car c;
        employee_tools.push_back(&c);
        employee_tools[0]->info();
    };


Funkcja info() jest funkcją wirtualną i tutaj działa dobrze, natomiast gdy chcę potem w klasie Trader wywołać taką samą linijkę w funkcji:

void show_equipment() override {
   std::cout << " Rozmiar wektora " << employee_tools.size(); // rozmiar się zgadza (2)
   employee_tools[0]->info(); // tutaj program  umiera
};

 

Coś jakby z typem wskaźnika jest nie tak, ale przecież liczę na polimorfizm i wyżej działa. Z góry dzięki.
    
 

komentarz zamknięcia: Problem rozwiązany

1 odpowiedź

+2 głosów
odpowiedź 4 września 2020 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 29 września 2020 przez sebaaas
 
Najlepsza

Zmienne (także obiekty) definiowane na stosie mają ustalony obszar życia, ograniczony blokiem kodu (funkcja, pętla, blok anonimowy). Po zakończeniu wykonywania danego bloku zmienna jest usuwana z pamięci (w przypadku obiektu wywoływany jest także destruktor). W twoim przypadku obiekty `p` i `c` będą zniszczone po wyjściu z funkcji `complete_equipment`. Należy użyć alokacji dynamicznej na stercie, za pomocą operatora `new`.

void complete_equipment() override {
        Phone *p = new Phone(123456789);
        employee_tools.push_back(p);
        Car *c = new Car;
        employee_tools.push_back(c);
        employee_tools[0]->info();
    };

Oczywiście później należy te obiekty usunąć za pomocą `delete`. Można też użyć inteligentnych wskaźników.

komentarz 5 września 2020 przez sebaaas Początkujący (350 p.)
Dzięki bardzo!

Podobne pytania

0 głosów
1 odpowiedź 1,062 wizyt
pytanie zadane 4 kwietnia 2017 w C i C++ przez Sidzej Użytkownik (850 p.)
0 głosów
2 odpowiedzi 408 wizyt
pytanie zadane 28 marca 2017 w C i C++ przez akiihombre Początkujący (250 p.)
0 głosów
2 odpowiedzi 603 wizyt

93,188 zapytań

142,204 odpowiedzi

322,027 komentarzy

62,515 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2817p. - dia-Chann
  2. 2769p. - Łukasz Piwowar
  3. 2759p. - Łukasz Eckert
  4. 2704p. - Tomasz Bielak
  5. 2678p. - Łukasz Siedlecki
  6. 2627p. - CC PL
  7. 2485p. - Marcin Putra
  8. 2443p. - rucin93
  9. 2418p. - Michal Drewniak
  10. 2367p. - Adrian Wieprzkowicz
  11. 2317p. - Mikbac
  12. 2156p. - Anonim 3619784
  13. 2127p. - Michał Telesz
  14. 1733p. - rafalszastok
  15. 1628p. - Dominik Łempicki (kapitan)
Szczegóły i pełne wyniki

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 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...