Singletony, metody statyczne, programowanie z użyciem WINAPI

0

W swoim programie chciałbym mieć obiekt gui odpowiedzialny za interfejs z użytkownikiem (kandydat na singletona). Myślałem wcześniej aby wskaźnik na ten obiekt byłby globalny, ale to za bardzo skąplikowałoby kod (są jeszcze inne obiekty). I jest kilka problemów z implementacją. Mógłby ktoś podać jakiś przykładowy kod klasy do zarządzania okienkami (tworzy okna, zawiera procedurę zdarzeniową itp.), która jest singletonem?

I jeżeli procedurę zdarzeniową okna zadeklaruję sobie jako metodę statyczną składową klasy, to jak można z niej odwoływać się do składowych klasy? (np. obsługując komunikat WM_SIZE chce poprzestawiać kilka okien MoveWindow, skąd wziąć uchwyty do nich?).

Kiedyś, z funkcją wątku robiłem tak:
funkcje zadeklarowałem jako globalną, zaprzyjaźnioną z daną klasą, a do składowych obiektu odwoływałem się poprzez zmienne globalne.

0
//deklaracja
class Win32Device
{
	public:
			Klasa();
			~Klasa();

			static Klasa *GetInstance() { return m_instance; };
	private:
			static Klasa *m_instance;
};

//definicja
Klasa *Klasa::m_instance = NULL;

Klasa::Klasa()
{

}

Klasa::~Klasa()
{

}

LRESULT CALLBACK Klasa::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	<font color="red">Klasa *_this = m_instance;</font>
	if(_this)
	{
		//możesz odowoływać się do składowych klasy za pomocą _this->składowa;
	}
}


0

I jeżeli procedurę zdarzeniową okna zadeklaruję sobie jako metodę statyczną składową klasy, to jak można z niej odwoływać się do składowych klasy?
Przy tworzeniu okna ustaw za pomocą SetWindowLong jego GWL_USERDATA na wskaźnik do twojej klasy. W metodzie zdarzeniowej wskaźnik na klasę odczytasz przy pomocy GetWindowLong(hWnd, GWL_USERDATA).

@fike: jak singleton to konstruktor niepubliczny.

0

Ok, poradziłem sobie z procedurą zdarzeniową. Czy funkcję wątku też mogę zadeklarować jako składową statyczną??

0

Tak. Wskaźnik na obiekt klasy możesz przekazać w parametrze CreateThread.

0

ja to najczęściej robię tak:

struct CThread{
[...]
 protected:
  static DWORD __stdcall sThreadProc(CThread*);
  void ThreadProc();
};

DWORD __stdcall CThread::sThreadProc(CThread* obj)
{
  obj->ThreadProc();
  return 0;
}

i przy tworzeniu wątku dajesz jako ten parametr this'a i masz wątek jako metodę klasy

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