Как обеспечить порядок вызова деструкторов

Я пытаюсь правильно настроить следующую настройку:

Данное приложение (с несколькими исходными файлами, единицами компиляции) имеет глобальные переменные типа класса A, определенные во многих компиляциях. единицы. Они должны «управляться» новым для введения класса B(где должен существовать только 1 экземпляр) в том смысле, что при создании они «регистрируют» себя в экземпляре класса B, а при уничтожении «подписываются». .

Настройка работы конструкторов довольно проста. Можно использовать:

types.h:

class B {
  static B& Instance() {
    static B singleton;
    return singleton;
  }
  void registerA( const A& a ) { 
  // whatever
  }
};


class A {
  A() { B::Instance().registerA( this ); }
};

Как правильно получить деструкторы? Если используется:

class A {
  A() { B::Instance().registerA( this ); }
  ~A() { B::Instance().signoffA( this ); }
};

, то деструктор Bможет быть вызван перед деструктором A. Затем экземпляр класса Aзавершается только что созданным экземпляром класса B.

Тестовый пример будет представлять собой установку нескольких исходных файлов с определениями экземпляров класса Aв пространстве имен:

file1.cc

#include "types.h"
namespace C {
   A a;
}

file2.cc

#include "types.h"
namespace C {
   A b;
}

Я думаю, можно сделать такая вещь легко с интеллектуальными указателями Boost. Однако, если возможно, я хотел бы избежать использования дополнительных библиотек, чтобы максимально снизить зависимость.

Одна вещь, которая может помочь: все глобальные переменные находятся в именованном пространстве имен.

5
задан ritter 19 May 2012 в 18:39
поделиться