我想獲得以下安裝正確的調用順序:如何執行析構函數
一個給定的應用程序(具有多個源文件,編譯單元)在許多編譯單元定義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中的關鍵字,因此您的代碼無法編譯。 –