Jak zaimplementować kolekcję objektów do narysowania?

0

Czyli jak zrobić tak, że mam wiele klas w jednej kolekcji
i chcę, żeby w każdej klasie inna metoda draw(DrawingArea& g); ( jak się da to abstrakcyjna).

Nie mam pojęcia jak to zrobić. Próbowałem na wirtualnych funkcjach to robić, i dziedziczyć adapter Drawable w każdej klasie, ale tak jak przypuszczałem, nie działa. Nie miałem z tym problemów w javie, która posiada późne wiązanie.

0

Abstrakcyjna to raczej tylko w jednej klasie bazowej.
Pokaż co ci nie działa.

0

O ile mi wiadomo, to nie mogę zrobić tak, jak tutaj napisałem.

Jeśli stworzę klasę bazową jako abstrakcyjną, to nie mogę utworzyć wektora kolekcji, bo pisze, że nie można utworzyć klasy abstrakcyjnej.
Próbowałem też zamiast abstrakcyjnej klasę wirtualną, no i wtedu oczywiście się wywołuje metoda klasy bazowej.

Do wywołania właściwej metody dla każdej klasy potrzebowałbym typu objektu, robiąc tym sposobem,
ale nie wiem, jak ten typ wydobyć, skoro mam tylko typ Drawable.

Z tym kodem mi się nie skompiluje, bo nie mogę abstrakcyjnej klasy tworzyć w wektorze.

Drawable.h


class Drawable
{
public:
    Drawable(void);
    virtual ~Drawable(void);

    virtual void draw(DrawingArea& c) = 0;
};

tworzenie wektora objektów, które dziedziczą Drawable.


    vector<Drawable> sceneObjects;
    sceneObjects.push_back(board);
    sceneObjects.push_back(player1);
    for (unsigned i = 0; i < sceneObjects.size(); ++i) 
    {
        sceneObjects[i].draw(c);        // rysowanie na objekcie "c".
    } 
0

jak chcesz utworzyć obiekt klasy abstrakcyjnej skoro jest to klasa abstrakcyjna? To jest totalny bezsens. Fizycznie tego nawet nie wykonasz ponieważ w c++ klasa abstrakcyjna to taka, która posiada przynajmniej jedną metodę czysto wirtualną, a to oznacza, że ów metoda nie posiada swojej implementacji więc jest tylko "szkicem", który ma służyć do bazowania innym klasom, a nie do działania na niej.

marcos3131 napisał(a)

Próbowałem też zamiast abstrakcyjnej klasę wirtualną

czyli jaką?

1

Jeśli chcesz skorzystać z polimorfizmu to nie możesz trzymać obiektów w wektorze jako wartość, bo to konkretyzuje typ obiektu (a to jest klasa abstrakcyjna, więc nie możesz utworzyć takiego obiektu)!
Potrzebny ci wektor wskaźników na klasę abstrakcyjną.

0

O dzięki. Tak właśnie kombinowałem, żeby wskaźników użyć.
Teraz działa.

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