8.4. Automatically Adding New Class Instances to a Container
Problem
You need to store all instances of a class in a single container without requiring the users of the class to do anything special.
Solution
Include in the class a static member that is a container, such as a list, defined in <list>. Add an object’s address to the container at construction and
remove it upon destruction. Example 8-4
shows
how.
Example 8-4. Keeping track of objects
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
class MyClass {
protected:
int value_;
public:
static list<MyClass*> instances_;
MyClass(int val);
~MyClass();
static void showList();
};
list<MyClass*> MyClass::instances_;
MyClass::MyClass(int val) {
instances_.push_back(this);
value_ = val;
}
MyClass::~MyClass() {
list<MyClass*>::iterator p =
find(instances_.begin(), instances_.end(), this);
if (p != instances_.end())
instances_.erase(p);
}
void MyClass::showList() {
for (list<MyClass*>::iterator p = instances_.begin();
p != instances_.end(); ++p)
cout << (*p)->value_ << endl;
}
int main() {
MyClass a(1);
MyClass b(10);
MyClass c(100);
MyClass::showList();
}Example 8-4 will create output like this:
1 10 100
Discussion
The approach in Example 8-4 is
straightforward: use a static
list to hold pointers to objects. When an object is
created, add its address to the list; when it’s
destroyed, remove it. There are a couple of things to remember.
As with any static data member, you have to declare it in the class header ...