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

C++ polimorfizm vector błąd

VPS Starter Arubacloud
0 głosów
570 wizyt
pytanie zadane 25 czerwca 2018 w C i C++ przez niezalogowany

Witam, mam problem z tym kodem, ciągle wychodzi mi ten błąd, chodzi o używanie przestrzeni nienależącej do mnie, lecz nie wim o co chodzi, gdyż po testach wyszło, że pojawia się przy próbach wyświetlenia vectora.
Co źle zrobiłem?

Błąd:

Segmentation fault (core dumped)

A oto kod:

#include <iostream>
#include <vector>

using std::cout;
using std::endl;

class Object
{
public:

    virtual void draw()=0;
};

class Ground :public Object
{
public:
    Ground(){;}

    virtual void draw()
    {
        cout<<'G';
    }
};
class Air :public Object
{
public:
    Air(){;}

    virtual void draw()
    {
        cout<<'A';
    }
};
class Map
{
int x,y;
std::vector<Object*> obj;
public:
Map(int xx,int yy)
{
    x=xx;
    y=yy;
}
void set()
{
    for(int yy=0;yy<y;yy++)
    {
        for(int xx=0;xx<x;xx++)
        {
            Ground g1;
            Object *wsk = &g1;
            obj.push_back(wsk);
        }
        cout<<endl;
    }
}
void draw()
{
    for(int i=0;i<obj.size();i++)obj[i]->draw();
}
};
int main()
{
    Map map(20,5);
    map.set();
    map.draw();
    return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 25 czerwca 2018 przez criss Mędrzec (172,590 p.)
wybrane 25 czerwca 2018
 
Najlepsza
void set()
{
    for(int yy=0;yy<y;yy++)
    {
        for(int xx=0;xx<x;xx++)
        {
            Ground g1;
            Object *wsk = &g1;
            obj.push_back(wsk);
        }
        cout<<endl;
    }
}

g1 to obiekt lokalny, nie możesz sobie dodać wskaźnika do vectora i oczekiwać, że wskaźnik zawsze będzie wskazywał na obiekt. g1 przestaje istnieć po wyjściu poza zakres (scope) - w Twoim przypadku iteracja pętli for.

komentarz 25 czerwca 2018 przez niezalogowany
Czyli jak to naprawić?
komentarz 25 czerwca 2018 przez RafalS VIP (122,820 p.)
Skoro chcesz mieć wektor wskaźników to musisz używać dynamicznej alokacji: new i delete. Inaczej bardzo możliwe, że automatyczna dealokacja zwolni Ci obiekty na które te wskaźniki pokazują.

Podobne pytania

0 głosów
1 odpowiedź 138 wizyt
0 głosów
1 odpowiedź 690 wizyt
pytanie zadane 4 kwietnia 2017 w C i C++ przez Sidzej Użytkownik (850 p.)
0 głosów
2 odpowiedzi 262 wizyt
pytanie zadane 20 czerwca 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...