Przypisanie wskaźnikowi obiektu klasu pochodnej.

0

Witam, prosiłbym o poradę dotyczącą kodu.

W programie mam klasę bazową MapObject oraz klasę pochodną Wall. Dynamicznie alokuję pamięć dla wskaźnika typu MapObject tworząc tablicę dynamiczną.

MapObject **map = new MapObject*[16];
    for( int i = 0; i < 16; i++ )
        map[i] = new MapObject[20]; 

Następnie, wczytuję dane z pliku zawierającego liczby w macierzy 16x20 i jeśli liczba wczytana wynosi 1 to dla danych współrzędnych chcę przypisać wskaźnikowi map obiekt klasy Wall zamiast MapObject. Oczywiście MapObject jest klasą wirtualną. Jednak kiedy napisałem to po swojemu, po zakończeniu pętli każdy element tablicy był typu MapObject
Jak zrobić to przypisanie?

 void map_generator::GetMapFromFile( void )
{
    int type;
    int i = 0;
    int j = 0;
    while( !map_file.eof() )
    {
        map_file >> type;
        if( type == 1 )
        {
            // przypisanie map[j][i] obiektu typu Wall
        }
        i++;
        if( !(i % 20))
        {
            i = 0;
            j++;
        }
    }
}

z góry dziękuję za pomoc :)

0

Bo to muszą być wskaźniki, póki co jak przypiszesz będziesz mieć object slicing. Tzn. brakuje trzeciego * w map i potem będziesz musiał ładnie tworzyć nowy obiekt typu Wall i tak uzyskany wskaźnik wsadzać w odpowiednie miejsce. Nie zapomnij o zwalnianiu miejsca.

O takie coś mi chodzi:
http://ideone.com/jI4ao

0

Dziękuję bardzo za odpowiedź. Teraz do mnie dotarło jaki to był głupi błąd, że tworzyłem tablicę obiektów a nie wskaźników do obiektów jak powinienem.

Ten kod jest poprawny?

MapObject*** map;
MapObject*** pConst;

map = new MapObject**[16];
for( int i = 0; i < 16; i++ )
map[i] = new MapObject*[20];

void map_generator::GetMapFromFile( void )
{
    int type;
    int i = 0;
    int j = 0;
    while( !map_file.eof() )
    {
        map_file >> type;
        if( type == 1 )
        {
            Wall wall(i,j);
            *(*(map+i)+j) = &wall;
        }
        i++;
        if( !(i % 20))
        {
            i = 0;
            j++;
        }
    }
}

for( int i = 0; i < 16; i++ )
        delete [] pConst[i];
    delete [] pConst;

Jak sprawdzić poprzez funkcję typeid( arg ).name() czy wybrany wskaźnik pokazuje na obiekt typu Wall? Bo pogubiłem się trochę z tymi asterix'ami.

Wielkie dzięki za kod. Szczególnie spodobał mi się pomysł z typedef. Na pewno przyda się na przyszłość i przy okazji uzmysłowił mi możliwości z nim związane :)

0

Ten kod nie jest poprawny, bo kiedy skończy się zakres ten obiekt:

Wall wall(i,j);

przestanie istnieć. (A zakres kończy się dwie linijki niżej) Zauważ, że w przykładzie, który Ci podałem obiekty tworzone są na stercie. Co do typeid, prościej jest chyba zaimplementować virtualną funkcję, która zwraca jakąś określoną wartość w zależności od typu obiektu. Dodatkowo z Twojego kodu wynika, że w tablicy będzie albo Wall albo nic, więc możesz po prostu sprawdzać czy wskaźnik jest NULL (w C++11 nullptr).

Zamiast używać arytmetyki wskaźników lepiej używaj tablicowej notacji [i][j] i zrób sobie stałe, które będą wymiarami tablicy, żebyś się w przyszłości nie pomylił.

0

Ogromne dzięki. Bez Twojej pomocy pewnie stałbym ciągle w miejscu. Co do kodu to dlatego, że nie działał nie zajmowałem się kolejnymi klasami pochodnymi ale na pewno takie wnet powstaną.

Zdecydowanie tworzenie obiektów na stercie jest lepsze tylko nie byłem pewien jak napisać odpowiednie zwalnianie pamięci. Zaraz wszystko poprawię.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0