サードパーティのライブラリ(Bar)の上にライブラリ(Foo)を構築しています。このライブラリInitialise()
を使用するプログラムの開始時に無料の関数を呼び出し、DeInitialise()
最後に関数を呼び出す必要があります。これらの関数をライブラリに「カスケード」したいので、ユーザーはサードパーティのライブラリの初期化について何も知らなくても、自分のライブラリを初期化する必要があります。さらに、同じ場所で、ライブラリが必要とする可能性のある他の初期化を実行できます。無料の関数を使用して、サードパーティのライブラリのアプローチを使用できます。例:
namespace Foo
{
Initialise()
{
Bar::Initialise();
// Do rest of Foo's initialisation
}
DeInitialise()
{
Bar::DeInitialise();
// Do rest of Foo's de-initialisation
}
}
Foo::Initialise
Fooのユーザーは、使用する前と最後に呼び出す必要がありFoo::DeInitialise
、一度だけ呼び出されるようにする責任があります(したがって、スレッドセーフの問題について心配する必要はありません)。
これは、この問題の解決策を探すときに私が主に遭遇したアプローチです。ただし、現在、すべての初期化と非初期化をクラスのコンストラクタ/デストラクタに配置することを検討しています。例:
Class Initialiser
{
Initialiser()
{
Bar::Initialise();
// Do rest of Foo's initialisation
}
~Initialiser()
{
Bar::DeInitialise();
// Do rest of Foo's de-initialisation
}
}
したがって、ユーザーは非初期化について心配する必要がなくなりInitialiser
ます。プログラムの開始時にスタック上にオブジェクトを作成するだけで、プログラムの終了時にデストラクタが残りの処理を行います。
私の質問は:これは合理的なアプローチですか?考慮すべき潜在的な落とし穴や代替ソリューションはありますか?コンストラクタとデストラクタだけでデータメンバーがないクラスを持つことも有効ですか?