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

C++ polimorfizm vector błąd

0 głosów
301 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,640 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,860 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ź 84 wizyt
0 głosów
1 odpowiedź 301 wizyt
pytanie zadane 4 kwietnia 2017 w C i C++ przez Sidzej Użytkownik (850 p.)
0 głosów
2 odpowiedzi 133 wizyt
pytanie zadane 20 czerwca 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)

86,484 zapytań

135,239 odpowiedzi

300,481 komentarzy

57,230 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...