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

C++ polimorfizm vector błąd

Object Storage Arubacloud
0 głosów
581 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ź 140 wizyt
0 głosów
1 odpowiedź 717 wizyt
pytanie zadane 4 kwietnia 2017 w C i C++ przez Sidzej Użytkownik (850 p.)
0 głosów
2 odpowiedzi 264 wizyt
pytanie zadane 20 czerwca 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)

92,554 zapytań

141,400 odpowiedzi

319,537 komentarzy

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

...