我正在尝试正确设置以下设置:
class A
给定的应用程序(具有多个源文件、编译单元)具有在许多编译单元中定义的类型的全局变量。这些应该由要引入的新成员“管理” class B
(其中应该只存在一个实例),因为在创建时它们在 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
。
测试用例将是一个多源文件设置,其中定义class A
了命名空间中的实例:
file1.cc
#include "types.h"
namespace C {
A a;
}
file2.cc
#include "types.h"
namespace C {
A b;
}
我猜想使用 Boost 智能指针可以轻松完成这样的事情。但是,如果可能的话,我想避免使用额外的库来保持尽可能低的依赖。
一件事可能会有所帮助:所有全局变量都在命名空间中。