私は次の設定を正しくしようとしています:
class A
特定のアプリケーション(複数のソースファイル、コンパイルユニットを含む)には、多くのコンパイルユニットで定義されたタイプのグローバル変数があります。class B
これらは、作成時にクラスBのインスタンスに「登録」し、破棄時に「サインオフ」するという意味で、導入する新規(1つのインスタンスのみが存在する必要がある)によって「管理」される必要があります。
コンストラクターが機能するように設定するのはかなり簡単です。使用できるもの:
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スマートポインタを使えば、そのようなことが簡単にできると思います。ただし、可能であれば、依存関係をできるだけ低く保つために追加のライブラリを使用することは避けたいと思います。
役立つかもしれない1つのこと:すべてのグローバル変数は名前空間にあります。