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ć?
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.
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
Jak to najprościej zrobić?
Najprościej? Dziwne pytanie.
int i;
Ale nie idź tą drogą.
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.
zmienna statyczna cntObjcs, i przy tworzeniu kazdego obiektu przypisujesz wartosc do id i zwiększasz cntObjs
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; }
};