globalne obiekty

0

Witam,

Przeszukałem już całe forum, widziałem podobne przypadki ale ciągle nie znalazłem ani odpowiedzi dlaczego dzieje się tak jak dzieje oraz jak wyjść z tej kłopotliwej sytuacji.

Wiem, że to w programowaniu obiektowym nieco nieeleganckie ale potrzebuję mieć globalny obiekt będący niejako listą innych zmiennych (wczytywanych z pliku konfiguracyjnego). Pracuję na kilku plikach i mam problem:

Jeżeli zadeklaruję w jednym pliku obiekt globalny jako statyczny to ładnie mi się skompiluje, mogę wykorzystać go w innym pliku ALE modyfikując go lekko w jednym pliku nie dokonuję jednocześnie modyfikacji w innym. Gdzieś przeczytałem, że zmienna globalna zadeklarowana jako statyczna jakoś ogranicza zasięg tej zmiennej tylko do tego pliku? Pomyślałem - musi ona zostać zadeklarowana jako globalna ale niestatyczna. Niestety powoduje to błędy kompilacji typu:

Błąd 1 error LNK2005: "class VAR varlist" (?varlist@@3VVAR@@A) already defined in bsio.obj D:\Documents\Visual Studio 2010\Projects\Battleship\Battleship\core.obj Battleship

Dodam jeszcze, że używam komend #define, #ifdef, #endif w celu uniknięcia redefinicji jakiegoś obiektu oraz nie widzę żadnej różnicy czy używam extern czy nie. Pomijając fakt że nie powinienem używać zmiennych globalnych to jak to poprawnie powinno być napisane?

1

static wewnątrz klasy ma inne znacznie niż na zewnątrz klasy.
static na zewnątrz oznacza, że dany symbol ma być widoczny jedynie w ramach jednego pliku źródłowego, w którym się znajduje.
Chodzi o to, żeby symbol potrzebny w jednym module, nie był widoczny w innych.

ty masz zrobić tak:
w pliku nagłówkowym masz mieć deklaracje zmiennej poprzedzoną słowem kluczowym extern.
W JEDNYM pliku modułu (cpp) masz mieć definicję symbolu (bez static, bez extern).
Tam gdzie chcesz mieć dostęp do zmiennej załączasz plik nagłówkowy.

0

No właśnie wydaje mi się że taką sytuację mam. Tym bardziej się dziwię co jest nie tak...

EDIT: nie doczytałem, deklarację obiektu globalnego bez żadnych słów kluczowych (VAR varlist) mam mieć w pliku przykładowym klasy.cpp tak?
we wszystkich plikach nagłówkowych, również klasy.h ma być extern VAR varlist;
w pliku core.cpp z funkcją main ma być również extern VAR varlist;
Dobrze zrozumiałem?

1
trolley napisał(a):

No właśnie wydaje mi się że taką sytuację mam. Tym bardziej się dziwię co jest nie tak...

No jak widać nie masz. Masz dwa obiekty, które przy linkowaniu powodują błąd. Definicję masz mieć w jednej jednostce translacji (czyli jednym pliku źródłowym). W każdym innym pliku obiekt ten ma mieć tylko deklarację, czyli zapis ze słowem kluczowym extern. Aby to ułatwić, ta deklaracja powinna być w pliku nagłówkowym, który dołączasz tam, gdzie chcesz użyć obiektu.

0

Działa dokładnie tak jak mi to było potrzebne. Dzięki wielkie chłopaki :)

Mogę mieć jeszcze jedno pytanko nie do końca związane z tematem? Jak nie to temat do zamknięcia, to nie jest już aż tak ważne dla mnie.

Ta aplikacja jest aplikacją konsolową w której sobie ustalam za pomocą winapi np szerokość okna. Jednakże da się tą szerokość zmienić wchodząc w ustawienia okna konsoli podczas działania programu. Da się to jakoś zablokować?

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