Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] Implementacja klasy dziedziczącej po klasie abstrakcyjnej

Ostatnio zmodyfikowano 2015-07-30 20:51
Autor Wiadomość
tomasz
Temat założony przez niniejszego użytkownika
[SFML] Implementacja klasy dziedziczącej po klasie abstrakcyjnej
» 2015-07-29 13:15:17
Witam,

od jakiegoś czasu staram się stworzyć prostą architekturę, która pomoże mi przy tworzeniu przycisków. Mianowicie stworzyłem klasę Button która jest abstrakcyjna. Następnie tworzę takie klasy jak np RectangleButton oraz HexagonButton. Chce zaimplementować w klasie Button pole sf::Shape, które w klasie RectangleButton zainicjowałbym jako RectangleShape, a w klasie HexagonButton jako CircleShape. Implementacja typu sf::Shape Texture; jest niemożliwa ponieważ niedozwolone są abstrakcyjne obiekty. Próbowałem stworzyć także znacznik i referencje sf::Shape, ale miałem problemy z inicjalizacja. Przesiadam się z .Netu, gdzie mógłbym użyć interfejsów, tu ich nie mam stąd moje problemy architektoniczne.
P-135380
Monika90
» 2015-07-29 13:43:11
class Button
{
    std::unique_ptr<sf::Shape> shape;

};

Choć, jak sam wiesz, najlepiej żeby na szczycie hierarchii były interfejsy, to że SFML nie używa interfejsów (patrz sf::Transformable), nie oznacza że Ty nie możesz ich używać.
P-135384
tomasz
Temat założony przez niniejszego użytkownika
» 2015-07-30 14:45:42
Niestety nie udało mi się rozwiązać problemu Twoją propozycją, ale ostatecznie udało mi się rozwiązać problem poprzez zwykły wskaźnik. Jednak mam teraz pewien problem z tym wskaźnikiem którego nie mogę zrozumieć. Gdy stworzę bezpośrednio w metodzie main mój przycisk (np. RectangleButton), wszystko ładnie działa. Natomiast jeśli stworzę klasę której polem jest mój przycisk zaraz po jego stworzeniu, wskaźnik którym pierwotny problem został rozwiązany jest czyszczony, mimo, że pole na które wskazywał jest prawidłowe. Skrócona struktura aplikacji:

C/C++
class Button() //abstrakcyjna
{
    Shape * Texture;
}

class RectangleButton
    : public Button
{
    RectangleShape Shape;
   
    RectangleButton()
    {
        Shape = RectangleShape( Vector2f( height, width ) );
        ( Texture ) = & Shape; //CircleShape(height, 4);
    }
}

class Map
{
    RectangleButton RectangleButton;
}

Problem polega na tym, że korzystając z RectangleButton  jako pola klasy Map, jego wskaźnik nie wskazuje na to co powinien. Chciałem zapytać co mogłoby tu przestawiać wskaźnik? W klasie Map jedyne operacje na RectangleButton  to metoda która to tworzy i metoda która go rysuje.
P-135460
pekfos
» 2015-07-30 14:52:25
Nie masz zaimplementowanego kopiowania. Domyślne kopiowanie skopiuje Shape i Texture, ale to drugie będzie wskazywać na Shape w oryginalnym obiekcie, a nie nowym.

Po co w ogóle ten wskaźnik? Nie prościej zrobić metodę wirtualną do rysowania? Wtedy każdy przycisk będzie mógł narysować się jak tylko będzie chciał. To znacznie większe możliwości, niż wyświetlanie przez sf::Shape.
C/C++
virtual void /* Button:: */ render( sf::RenderTarget & rt ) const
P-135462
tomasz
Temat założony przez niniejszego użytkownika
» 2015-07-30 14:56:56
Wskaźnik zrobiłem po to aby mieć dostęp do obiektu. Metode rysowania zrobiłem właśnie wirtualną, jednak niektóre operację są różne w zależności od klasy, np inaczej tworze obiekt jeśli chce przycisk prostokątny, a inaczej jeśli okrągły. Widzisz lepsze rozwiązanie w takiej sytuacji?
P-135463
pekfos
» 2015-07-30 15:01:18
Wskaźnik zrobiłem po to aby mieć dostęp do obiektu.
Do czego, w klasie bazowej, potrzebujesz tego dostępu do obiektu?

inaczej tworze obiekt jeśli chce przycisk prostokątny, a inaczej jeśli okrągły
Dlatego masz klasy pochodne, które mają zamykać w sobie te szczegóły. W prostokątnym będzie pewnie metoda do ustawienia szerokości i wysokości, a w okrągłym coś do stawiania promienia. Pozycja jest polem wspólnym dla każdego przycisku, więc będzie w klasie bazowej. Jak masz wirtualną metodę do rysowania, to tam możesz narysować cokolwiek. Po co klasa bazowa ma cokolwiek na ten temat wiedzieć..? Wszystkie informacje masz - albo ogólne z klasy bazowej, albo szczegółowe z pochodnej.
P-135464
tomasz
Temat założony przez niniejszego użytkownika
» 2015-07-30 18:46:30
Rozumiem, ale jeśli w klasie bazowej chce zrobić jak wspomniałeś ustawienie pozycji to potrzebuje obiektu któremu pozycję ustawiam. Dla tego potrzebuje tego wskaźnika.
P-135483
pekfos
» 2015-07-30 19:03:47
ale jeśli w klasie bazowej chce zrobić jak wspomniałeś ustawienie pozycji to potrzebuje obiektu któremu pozycję ustawiam. Dla tego potrzebuje tego wskaźnika.
..
C/C++
sf::Vector2f pozycja;
P-135488
« 1 » 2
  Strona 1 z 2 Następna strona