Wykorzystywanie klasy w kilku miejscach

0

Witam,

Piszę do was z prośbą o pomoc w wymyśleniu jak najlepszego rozwiązania problemu. A jest on następujący:
Jest klasa okno, która zajmuje się oknem i potrafi wczytywać obrazek.
Następnie jest klasa wyświetlająca obrazek oraz klasa przetwarzająca obrazek, obie klasy znajdują się wewnątrz klasy okna.
Pytanie jest następujące:
Jak stworzyć klasę dla obrazka i gdzie powinna się ona znajdować aby spełniała swoja rolę czyli, klasa okna mogła by wczytać nowy obrazek, klasa wyświetlająca mogła by wyświetlać ten obrazek, a klasa przetwarzająca działać na nim i zastępować go przetworzonym obrazkiem.

Tak myślałem nad tym i jedyny pomysł jaki przychodzi mi do głowy to stworzenie klasy ze statycznymi metodami i zmiennymi. Klasa ta znajdowała by się w klasie okno, a dzięki temu, że ma statyczne funkcje i zmienne w klasie wyświetlającej mógłbym wywołać Obrazek::pobierzAktualny() i zwracany by był do niego wskaźnik(lub bindować texture gdyż robię to w openGL), natomiast w klasie przetwarzającej mógłbym pobrać jak poprzednio Obrazek::pobierzAktualny() oraz zmienić po przetworzeniu Obrazk::ustawAktualny(nowyObrazek).
Mając tak przygotowaną klasę mógłbym zrobić w środku wektor trzymający wskaźniki do obrazków.

Co myślicie o takim rozwiązaniu? Niestety nie mam więcej pomysłów dlatego prosiłbym o rady jak najlepiej to zrobić :)

Dziękuje i pozdrawiam

0

Pierwszy sposób to jeśli klasa okna miała by swoje instancje klas przetwarzających obrazek i wyświetlających obrazek? Albo zrobić klasę aplikacji, która ma instancję klasy przetwarzającej obrazek i wyświetlającej obrazek i mogła by udostępniać wskaźniki do tych instancji klasie okna. Wtedy inne okna mogły by skorzystać z tych samych klas przetwarzających obrazek i wyświetlających obrazek. Instancję klasy obrazka to chyba w funkcji main czy gdzieś gdzie zajdzie potrzeba użycia jej stworzyć i klasę okna poinformować o tym przez jakąś funkcję, że w jakimś miejscu ma wyświetlić obrazek? Tak zaobserwowałem, że jest zrobione w różnych bibliotekach.

0

Chciałbym uniknąć właśnie każdorazowego przesyłania wskaźników do tych klas, a na moje aktualne potrzeby wystarczy klasa okno(rozszerzyć to będzie łatwo).
W przyszłości chciałbym z tej klasy stworzyć menadżera obrazków i nie widzi mi się za bardzo wysyłania w parametrach wskaźników do obrazków, dlatego myślę właśnie o statycznych metodach i zmiennych. Np. mam funkcję invert, która neguje wartość pikseli w obrazku,
łatwiej było by użyć ją w taki sposób: invert(), niż invert(obrazek). Tym bardziej, jak wcześniej wspomniałem rozszerzył bym to w przyszłości do menadżera dzięki któremu będę mógł zrobić funkcję chociażby cofania. Bo w momencie, w którym chciałbym zapisywać nowo wygenerowany obrazek do klasy menadżera, to musiałbym zwracać wskaźnik i wtedy interfejs staje się straszny, nie wspominając już, że niektóre funkcję potrzebować będą wielu parametrów.

To czy obrazek będzie znajdował się w mainie czy w klasie okna nie ma znaczenia, raczej chciałbym rozwiązać ciekawie ten problem. Nie musimy się trzymać tutaj tego modelu, a może bardziej ogólnie jak połączyć takie klasy ze sobą.

0

a może bardziej ogólnie jak połączyć takie klasy ze sobą.
Klasa aplikacji miała by metodę dodającą do listy wskaźnik na okno i później wywoływała by w tym oknie metodę, która by w klasie okna ustawiła aplikację, do której okno należy. To jakiś menadżer zasobów w klasie aplikacji zrobić, żeby zidentyfikować obrazek po std::stringu i jeśli okno miało by wskaźnik do aplikacji to wiele okien mogło by mieć ten sam obrazek w jednym miejscu. Przynajmniej ja bym tak to sobie zrobił. Wszystko zależy już od klepacza kodu co wybierze.

0

Aplikacje piszę dla siebie, i tutaj nie jest problem wiele okien. Problemem jest jak zrobić, aby te dwie klasy(wyświetlająca i przetwarzająca znajdujące się w klasie okno) miały dostęp do obrazka w sposób inny niż przekazywanie za każdym razem wskaźnika. Może jakiś wzorzec projektowy by tutaj pomógł? Na razie jedyne rozwiązanie, które w jakiś sposób mnie zadowala to stworzenie klasy MenadżerObrazkow, trzymający w sobie statyczny wektor w którym będą przechowywane obrazki. Mniej więcej coś takiego:

class ImageManager {
private:
 static int index;
 static std::vector<std::unique_ptr<Image>> images;
public:
 // konstruktory, destruktor
 static Image * getImage() { return images[index].get(); }
 static void addImage(Image * im) { images.push_back(im); } // Tak na szybko, normalnie tworzony byłby unique_ptr tutaj
// itp
}
 

Dzięki takiemu rozwiązaniu w klasie wyświetlającej mogę zrobić tak(podobnie w klasie przetwarzającej lecz tam będzie trzeba np. dodać nowy):

 
 ImageManager::getImage()->bind();
0

Niestety nie mogę odpowiadać pod postem, to napiszę tutaj.
Niby, można ale czy jest sens robić klasę która ma prawie same funkcję statyczne? ;/ Chciałbym jakoś ciekawie ten problem rozwiązać, ale nie mogę wpaść na żaden pomysł. Może spotkałeś się jeszcze z jakimiś innymi rozwiązaniami niż te o których pisaliśmy?

1

To nie powinna być klasa statyczna.

0

Jak nie klasa statyczna to co innego?

0

Ok, ale jak zwykła to jak poradzić sobie z wykorzystywaniem jej w tych klasach? Za każdym razem przesyłać wskaźnik do obrazka? Czy może trzymać referencję menadżera obrazków w każdej klasie?

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