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 ...
Get C++ Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.