Zmienna globalna - duzy projekt, dostepnosc we wszystkich plikach

0

Mam duży projekt w c++ napisany (kazda klasa w dwoch plikach h i cpp). Chciałbym mieć w nim zmienną globalną tak aby była dostępna we wszystkich plikach i zeby byla wspoldzielona przez wszystkie pliki. Potrzebuje jej po to zeby zliczac obiekty jednej klasy, ktore sa tworzone w wielu miejscach w projekcie. Jak to najprościej zrobić?

7

To prawie na pewno zły pomysł, przemyśl swój design.

Ale jeśli już (uważasz że) musisz to mieć: statyczna zmienna, np. typu atomic<int>. Inkrementuj w konstruktorze, pamiętaj o konstruktorach kopiujących i move.

2
Mikilll napisał(a):

Potrzebuje jej po to zeby zliczac obiekty jednej klasy, ktore sa tworzone w wielu miejscach w projekcie. Jak to najprościej zrobić?

class Foo {
private:
     static std::atomic<std::size_t> objectCount;

public:
     virtual ~Foo() { --objectCount; }
     Foo() { ++objectCount; }
     Foo(const Foo& other) { ++objectCount; }
     Foo(Foo&& other) {}

    static std::size_t GetObjectCount() { return objectCount; }
};


std::atomic<unsigned int> Foo::objectCount = 0;

Usprawnienie z szablonami:
http://melpon.org/wandbox/permlink/t7OgfYonq5adBG8u

2

Jak to najprościej zrobić?

Najprościej? Dziwne pytanie.

int i;

Ale nie idź tą drogą.

0

Dzięki wam wszystkim za odpowiedzi, ale niestety zle sie wyrazilem z tym zliczaniem obiektow. Otoz ja mam w projekcie pewna klase i ona ma pole id. Pierwszy obiekt tej klasy ma id=0, kolejny id=1, itd. Jak takie coś zrobić? Bo można np. konstruktor wywoływać z parametrem id++, ale id musiałoby być wtedy zmienną globalną widoczną we wszystkich plikach. Zmienna statyczna w klasie to raczej słaby pomysł, bo wszystkie obiekty będą współdzielić tę zmienna, a każdy obiekt ma mieć osobny id.

Druga sprawa. Co robi słowo atomic? Coś kojarzę, że ma coś to wspólnego z wielowątkowością, ale dokładnie nie wiem.

1

zmienna statyczna cntObjcs, i przy tworzeniu kazdego obiektu przypisujesz wartosc do id i zwiększasz cntObjs

1
class Foo {
  /* Class-related */
private:
  static std::atomic< std::size_t > numInstances;
public:
  static std::size_t TotalInstances() { return numInstances; }
/* Per-instance */
private:
  std::size_t id;
public:
  Foo() : id( ++numInstances ) { }
  Foo( const Foo& src ) : id( ++numInstances ) { }
  Foo( Foo&& src ) { }
  ~Foo() { --numInstances; }
  inline std::size_t GetID() const { retutn this->id; }
};

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