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.