Witam. Mam problem. W jaki sposób zadeklarować zmienne żeby jej wartość była dostępna we wszystkich klasach umieszczonych w różnych plikach. Dane zmiennych chciałbym edytować, kurcze i nie mogę zaczaić jak to zrobić.
W programowaniu obiektowym z reguly unika sie zmiennych globalnych. Sprobuj przeanalizowac swoj projekt i zmienic go tak, by ich uzycie nie bylo potrzebne.
Jeśli w pierwszym pliku .cpp zadeklarujesz zmienną:
int a = 5;
To jest ona niewidoczna w drugim pliku. Aby była widoczna w drugim pliku piszesz tak:
extern int a;
Gdybyś napisał tylko:
int a;
To w momencie linkowania program by się wykrzaczył bo nastąpiłaby tu redefinicja zmiennej a. Słówko extern oznacza dla kompilatory tyle co: "Piszę tutaj deklarację (nie definicję) zmiennej 'a' ale została ona zadeklarowana (i być może zdefiniowana) w innym pliku. Otrzymasz definicję (deklarację) tej zmiennej w momencie linkowania".
Mam nadzieję, że teraz jest wszystko jasne.
EDIT:
Właśnie tak jak napisał poprzednik unikaj tego typu zapisu. Pamiętam moje początki z programowanie... ze zmiennymi globalnymi jest tyle zachodu, że szkoda się tym zajmować. Najlepiej zbierz wszystkie zmienne globalne w jakiś logiczny obiekt. Jeśli są to np. jakieś parametry programu możesz stworzyć sobie klasę Parametry. Może to być tzw. Singleton. Poczytaj trochę o tym.
To ja też wtrącę...
Jaka jest w tym przypadku różnica jeżeli zamiast extern napiszę static??
że static nie da się "wyciągnąć" z pliku *.c(pp/xx).
Nie rozumiem co znaczy "wyciągnąć".
Kiedyś działały mi static i extern i użyłem extern choć właściwie nie wiem dlaczego :-)
Kiedy używać extern a kiedy static?
Static w zasięgu globalnym nie robi nic poza przypisaniem jej wartości zerowej zaraz po uruchomieniu programu. Gdyby nie była static i nie została zainicjalizowana to mogłyby się tam znaleźć jakieś śmieci z pamięci. Słowo static nie ma żadnego związku z widocznością zmiennych w innym pliku.
Tak w ogóle to trochę sobie poczytaj, odpowiedzi na wszystkie swoje pytania znajdziesz w każdej książce o podstawach c++.
http://4programmers.net/C/Static dział "Inne zastosowania".
a jeśli ma być ciut bardziej obiektowo
plik nagłówkowy (*.h):
class KlasaStatyczna //singleton
{
public:
static int a; //zmienne singletonu
};
A w jednym z plików *.cpp
int KlasaStatyczna::a = 0; //fizyczne miejsce zmiennej z singletonu
i teraz w każdym *.cpp w którym widzisz KlasaStatyczna (dołączysz tam deklarację z pliku *.h) masz dostęp do tej zmiennej
i zmiennej używa się takiej zmiennej (metody też tak można robić) w ten sposób:
KlasaStatyczna::a = 666;
Zwykle w każdej aplikacji jest przynajmniej z jeden główny singleton, ja robię to w ten sposób, najprościej i najwygodniej
@_crayze to nie jest singleton!!! To jest jedynie statyczna zmienna, która jest identyczna dla wszystkich obiektów i jej zmiana w 1 z nich powoduje zmianę we wszystkich obiektach tej klasy.