【发布时间】:2012-05-26 21:49:44
【问题描述】:
我正在尝试正确设置以下设置:
给定的应用程序(具有多个源文件、编译单元)在许多编译单元中定义了 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 智能指针可以轻松完成这样的事情。但是,如果可能的话,我想避免使用额外的库来尽可能降低依赖性。
一件事可能会有所帮助:所有全局变量都在命名空间中。
【问题讨论】:
-
请修正缩进和范围。
-
另外,请考虑创建一个简短的连贯测试用例来说明您的
A实例相对于其他所有内容的创建位置。目前有点混乱。 -
请注意,
register是 C++ 和 C 中的关键字,因此您的代码无法编译。
标签: c++ constructor destructor