В классе надо завести статическое поле -- счётчик объектов класса, который увеличивается на 1 при каждом вызове конструктора и уменьшается на 1 при каждом вызове деструктора. Конструктор класса создаёт нужный тебе "полустатический" член только в том случае, когда счётчик равен 0, деструктор уничтожает "полустатический" член, когда счётчик после уменьшения равен 0.
Пример: класс Object с разделяемым динамически управляемым ресурсом типа Resource
// простейший ресурс
class Resource {
public:
Resource() { std::cout << "Resource allocated" << std::endl; }
~Resource() { std::cout << "Resource released" << std::endl; }
};
class Object {
private:
static unsigned int objcount; // счётчик "живых" объектов
static Resource * resource; // "полустатический" член класса
public:
Object() {
if (objcount == 0) resource = new Resource(); // захватить ресурс только при создании первого объекта
++ objcount; /* инициализация объекта */
std::cout << "Object created: number of objects " << objcount + 1 << std::endl;
}
~Object() {
-- objcount; /* очистка объекта */
std::cout << "Object destroyed: number of objects " << objcount << std::endl;
if (objcount == 0) { // освободить ресурс только при удалении последнего объекта
delete resource;
resource = 0;
}
}
};
Пример использования
unsigned int Object::objcount = 0;
Resource * Object::resource = 0;
int main()
{
std::cout << "Before creating objects" << std::endl;
Object * o1 = new Object();
Object * o2 = new Object();
Object * o3 = new Object();
delete o1;
delete o2;
delete o3;
std::cout << "After destroying objects" << std::endl;
return 0;
}
После компиляции и исполнения примера на консоль выводятся строки
Before creating objects
Resource allocated
Object created: number of objects 2
Object created: number of objects 3
Object created: number of objects 4
Object destroyed: number of objects 2
Object destroyed: number of objects 1
Object destroyed: number of objects 0
Resource released
After destroying objects
Видно, что ресурс захватывается при создании первого объекта, и освобождается при удалении последнего. Порядок создания и удаления объектов роли не играет.