2012-01-18 5 views
7

Moim bezpośrednim kontekstem jest platforma Windows, jednak mogę zadać to samo pytanie podczas pracy nad UI dla innego hosta GUI. Pracuję w dość prostym C++ winapi, bez ATL/MFC. Nie jestem zainteresowany wykorzystaniem globali, ale raczej bardziej akceptowaną praktyką wykonywania zadań związanych z Windowsem z danymi "Application".Jaki jest poprawny/zaakceptowany projekt dostępu do zmiennych aplikacji z klasy okna?

Rozważałem wprowadzenie do tego stylu mvvw lub mvc, ale zanim pójdę dalej, chciałbym opinii społeczności, z tego co wyobrażam sobie niezliczoną liczbę doświadczonych programistów i projektantów.

Moja klasa aplikacji ma członków okien. Czy klasa okna powinna być zaprojektowana z odniesieniem do aplikacji? Czy jest lepszy sposób niż to?

+0

Wskaźnik do klasy 'TThread' przechodzi w wątek Local Storage. Klasa 'TThread' ma wskaźnik do obiektu' TApplication' jako jego element danych. W każdym razie ma sens, aby uczynić 'TApplication' globalnym, ponieważ jego konstruktor zapewnia miejsce do przeprowadzenia inicjalizacji przed wywołaniem' main'. – lapk

+2

Wiem, że ludzie podejmują wiele wysiłków, aby uniknąć zmiennych globalnych (z powodu), ale czasami jest to mechanizm, który najlepiej odzwierciedla rzeczywistość. Jeśli zawsze istnieje jedna i tylko jedna instancja "aplikacji" według projektu, to dlaczego * nie * sprawiają, że jest globalna? –

+0

Albo Singleton ... http://en.wikipedia.org/wiki/Singleton_pattern. Ale wolałbym przekazać wszystkie moje obiekty Window jako odniesienie do Modelu, w twoim przypadku, który byłby obiektem Application AFAIU. –

Odpowiedz

1

Interfejs API Win okna daje Set/GetProperty(), który pozwala zdefiniować wskaźnik do dowolnego obiektu (np. Własny obiekt okna). Jednak z doświadczenia wiem, że jest raczej powolny.

Inną możliwością jest użycie mapy, w której wskaźnik okien Windows Win jest używany jako klucze, a wartością jest obiekt okna. To dużo szybciej, ale gdzie umieścisz tę mapę, jeśli nie masz żadnych globali?

Zgodnie z sugestią Samuela singleton pozwala uzyskać obiekt, który jest prawie taki sam jak globalny. Następnie możesz uzyskać obiekt okna używając wskaźnika okna API Win jako klucza i zwraca obiekt.

Jest to wymagane do mapowania zdarzeń przychodzących do obiektów okna. Cała reszta powinna być zrobiona na odwrót (Jak można się spodziewać, wywoływać funkcje tylko na obiekcie okna, które są odwzorowane w podobny sposób jak okna systemowe.)

Dlaczego nie używasz Qt? jest już w C++ i nie musisz się martwić o te szczegóły ...

Powiązane problemy