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 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access