Poprawne stworzenie dziedziczenia w klasach i związku między nimi

0

Chciał bym żebyście powiedzieli mi czy taki związek między klasami jest prawidłowy.

Klasa o
Klasa o1 : dziedziczy z "o"
Klasa o2 : dziedziczy z "o"

Klasa przełącznik.

Klasa przełącznik ma podlinkowane o1 i o2. W środku klasy przełącznik jest wskaźnik typu o, a w metodzie przypisywane są do niego obiekty new o1, lub new o2.

Natomiast w klasach o1 oraz o2 również jest podlinkowana klasa przełącznik, więc zachodzi cykl. W klasach tych jest metoda statyczna przełącznika która przełącza na inne okienko,usuwa dane itp.

Przełącznik jest singletonem. Czy takie relację między klasami są dobre?

0

Trudno powiedzieć czy są "dobre" nie wiedząc o co chodzi... Ale generalnie są poprawne, tzn mozesz tak zrobić. Nie jest to jakaś bardzo nietypowa sytuacja kiedy pole obiektu jakiejś klasy przechowuje wskaźnik/referencje na swojego "rodzica".

0

Chyba mnie nie zrozumiałeś, nie chodzi mi o przechowywanie wskaźnika.
U mnie jest problem z cyklem, tzn. obie klasy linkują się nawzajem. Singleton tam się bawi wskaźnikiem, natomiast druga klasa korzysta z metody singletona. Czy takie kółko relacji jest dobre ?

0

Jeśli to nie są wskaźniki to nie jest to nawet możliwe...

0

Przecież się kompiluję i wszystko działa :)

Singleton tylko operuję na wskaźniku który ustawiany jest na aktywne okienko. Wskaźnik -> new nazwaokienka. Dlatego ma podlinkowane wszystkie klasy okienek.

A klasy okienek mają ten singleton podlinkowany by użyć metody singletonu zmiany okienka.

To się kompiluje i działa, jednak mam obawy że coś z tym jest nie tak, dlatego oczekuję opinii żeby nie zawalić całego projektu w pewnym momencie. Powinienem to pozmieniać, czy zostawić ?

0

GameScreen.h to klasa z metodami wirtualnymi, dziedziczą po niej SplashScreen i MenuScreen. Jak widać niżej jest wskaźnik typu GameScreen.

#pragma once

#include <iostream>
#include <string>
#include <map>
#include"GameScreen.h"
#include "SplashScreen.h"
#include "MenuScreen.h"

class ScreenManager
{
private:
    ScreenManager();
    ScreenManager(ScreenManager const&);
    void operator=(ScreenManager const&);
 
    GameScreen *currentScreen;
 
    std::map<std::string, GameScreen*> screenDirectory;
 
public:
    ~ScreenManager();
    static ScreenManager &GetInstance();
 
    void AddScreen(std::string newScreen);
 
    void Initialize();
    void LoadContent();
    void UnloadContent();
    void Update(ALLEGRO_EVENT ev);
    void Draw(ALLEGRO_DISPLAY *display);
};

Fragment kodu który pokazuję po co dołączane są klasy okienek:

void ScreenManager::AddScreen(std::string screenName)
{
    currentScreen->UnloadContent();
    delete currentScreen;
	currentScreen = screenDirectory[screenName];
    currentScreen->LoadContent();
}

No a teraz klasa jednego z okienek, każde okienko ma podlinkowane ScreenManager.

#pragma once
 
#include "ScreenManager.h"

class SplashScreen : public GameScreen
{
private:
    std::pair<float,float> position;

	int imageNumber;
public:
    SplashScreen(void);
    ~SplashScreen(void);

    void LoadContent();
    void UnloadContent();
    void Update(ALLEGRO_EVENT ev);
    void Draw(ALLEGRO_DISPLAY *display);
};

A podlinkowane jest po to by móc używać tego:

ScreenManager::GetInstance().AddScreen("MenuScreen");
0

Czemu nie możesz tej funkcjonalności:

ScreenManager::GetInstance().AddScreen("MenuScreen");

dodać jako metodę w GameScreen ?

0

Singleton umożliwia mi wsadzenie potem tej funkcji wszędzie. Jeśli dodał bym ją do klasy GameScreen mógł bym się pozbyć tego cyklu, jednak nie mógł bym użyć już tej funkcji z singletona do klasy, która nie dziedziczy po GameScreen.

0

To wsadź ją do samego singeltona jako statyczną:

static void InstanceAddScreen(std::string screenName) { GetInstance().AddScreen(screenName); }
...
ScreenManager::InstanceAddScreen("MenuScreen");
0

W singletonie mam wskaźnik GameScreen którym tworzę nowe obiekty. Jak we wnętrzu GameScreena tworzyć obiekty klas pochodnych tak jak w metodzie AddScreen singletona ?

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