Statyczna składowa klasy w osobnym pliku bez załączania.

0

Hajo!
Mam dość ciekawy problem. Klasa do zarządzania appką(CApp) posiada statyczną składową Running. Po wciśnięciu CTRL+C Running ustawia się na false, appka elegancko wychodzi z głównej pętli. Na razie wszystko pięknie.

Teraz tak. CApp uruchamia sobie jakieś tam wątki. Może być jeden, może być 50. Przydałoby się zakończyć te wątki przed zamknięciem appki. Dlatego najlepiej, żeby miały one dostęp do CApp::Running. No, ale skoro CApp zarządza wątkami musi załączyć nagłówek klasy wątku (CThread.h). Więc w CThread.h nie mogę załączyć CApp.h. extern bool CApp::Running oczywiście nie zadziała - komplikat0r nie wie co to jest CApp.

Ktoś ma pomysł jak to rozwiązać bardziej elegancko niż ustawiając Running całkiem jako globalną (poza CApp), albo załączając CApp.h z CThread.cpp

0

Czemu nie możesz go niby includować? Strażnik naglówka sobie z tym poradzi. No i są jeszcze deklaracje zapowiadające... ;]

0

Ja nie powiedziałem, że nie chcę go include'ować tylko wiedzieć "jak to rozwiązać bardziej elegancko".

@kq: Chodziło mi o samo załączanie - nie chciałem wywoływać dyskusji na temat MT.

@Shalom: Jak chcesz tutaj zrobić forward deklaracje?

class CApp;
extern bool CApp::Running;

To nie zadziała. Klasa CApp nie jest zdefiniowana.
Samo:

class CApp;

też naturalnie nie zadziała z tego samego powodu.

1

Możesz przerobić CThread na klasę szablonową, wtedy ciężar zapewnienia implementacji będzie leżał na miejscu wykonania. Nie wiem, czy nazwałbym to bardziej eleganckim, ale na pewno jest to jakaś opcja.

#include <iostream>
#include <iomanip>

using namespace std;
#define DBG(x) cout << left << setw(30) << #x << boolalpha << (x) << endl;

struct CApp;

template<typename T = CApp>
struct CThread
{

	void run(){
		while(T::Running){
			DBG(T::Running);
			T::Running = false;
			DBG(T::Running);
		}
	}

};

struct CApp
{
	static bool Running;
	CThread<CApp> t;
};

bool CApp::Running = true;

int main(void)
{
	CApp ca;

	DBG(CApp::Running);
	ca.t.run();
	DBG(CApp::Running);

	return 0;
}

http://ideone.com/npEJnS

0

@Ola Nordmann, wklej pliki nagłówkowe, zaraz coś się wymyśli

0

Nic z tego nie będzie. forward-deklaracja stanowczo odpada - nie dla składowej klasy. Zostaje tylko zmienna globalna, albo include w CThread.cpp

0

A nie lepiej po prostu uniezależnic CThread od CApp? Przykładowwo do klasy CThread dodaj metodę stop, która będzie wołana przez CApp jeżeli dany thread ma się zatrzymać. Wtedy CThread nie musi wiedzieć niczego o klasie CApp (a to znaczy, że nie musi includowac "App,h").

0

Myślałem o tym, ale nie ma potrzeby wywoływać metody dla wszystkich wątków, dopakowywać tam bool'a. Tym bardziej, że charakter zmiennej jest dość jednoznaczny. Jak Appka chce wyjść to wątki muszą zrobić to samo. Nie ma przebacz.

Dlatego chciałem przekazać zmienną statyczną.

0

Wklej pliki nagłówkowe, bo nie mogę sobie wyobrazić dlaczego Ci to nie działa.

0

Coś mi nie działa? O.o

Ktoś ma pomysł jak to rozwiązać bardziej elegancko

0

Myślałem o tym, ale nie ma potrzeby wywoływać metody dla wszystkich wątków, dopakowywać tam bool'a. Tym bardziej, że charakter zmiennej jest dość jednoznaczny. Jak Appka chce wyjść to wątki muszą zrobić to samo. Nie ma przebacz.

Możesz stworzyć zmienną statyczną w klasie CThread (powiedzmy m_Stopped) oraz metodę statyczna Stop() która przestawi tą zmienną. W takim przypadku CThread wciąż nie musi nic wiedzieć o implementacji CApp więc problem jest rozwiązany.

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