Я пытаюсь правильно настроить следующую настройку:
Данное приложение (с несколькими исходными файлами, единицами компиляции) имеет глобальные переменные типа класса 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. Однако, если возможно, я хотел бы избежать использования дополнительных библиотек, чтобы максимально снизить зависимость.
Одна вещь, которая может помочь: все глобальные переменные находятся в именованном пространстве имен.