protected:
int value_;
public:
static list
MyClass(int val);
~MyClass();
static void showList();
};
list
MyClass::MyClass(int val) {
instances_.push_back(this);
value_ = val;
}
MyClass::~MyClass() {
list
find(instances_.begin(), instances_.end(), this);
if (p != instances_.end()) instances_.erase(p);
}
void MyClass::showList() {
for (list
p != instances_.end(); ++p)
cout << (*p)->value_ << endl;
}
int main() {
MyClass a(1);
MyClass b(10);
MyClass с(100);
MyClass::showList();
}
Пример 8.4 создаст следующий вывод.
1
10
100
Подход в примере 8.4 очень прост: используйте для хранения указателей на объекты static list
list
; при его уничтожении он удаляется. Здесь имеется пара важных моментов.При использовании любых членов-данных типа static
static
требуется определять в файле реализации, а не в заголовочном файле. За объяснением причин обратитесь к рецепту 8.5.Вы не обязаны использовать член static
MyClass
и в общем случае выполнять еще целый ряд действий.Помните, что совместное использование глобального контейнера, как в примере 8.4, не будет работать, если объекты класса MyClass
Если требуется отслеживать все экземпляры класса, можно также использовать шаблон фабрики. В целом это будет означать, что для создания нового объекта клиентский код вместо вызова оператора new должен будет вызывать функцию. За подробностями о том, как это делается, обратитесь к рецепту 8.2.
Рецепт 8.2.
8.5. Гарантия единственности копии переменной-члена
Имеется переменная-член, у которой должен быть только один экземпляр независимо от числа создаваемых экземпляров класса. Этот тип переменных-членов обычно называется статическими членами или переменными
Объявите переменную-член с ключевым словом static
// Static.h
class OneStatic {
public:
int getCount() {return count;}
OneStatic();
protected:
static int count;
};
// Static.cpp
#include "Static.h"
int OneStatic::count = 0;
OneStatic::OneStatic() {
count++;
}
// StaticMain.cpp
#include
#include "static.h"
using namespace std;
int main() {
OneStatic a;
OneStatic b;
OneStatic c;
cout << a.getCount() << endl;
cout << b.getCount() << endl;
cout << c.getCount() << endl;
}
static
static
, то будет создана только одна такая переменная вне зависимости от количества созданных объектов этого класса. Аналогично, если объявить как static
переменную функции, она будет создана только один раз и будет хранить свое значение от одного вызова функции к другому. Однако в случае с переменными-членами, чтобы убедиться, что переменная создана правильно, требуется проделать несколько больше работы. Именно по этой причине в примере 8.5 показано три файла.Во-первых, при объявлении переменной требуется использовать ключевое слово static