1

サードパーティのライブラリ(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::InitialiseFooのユーザーは、使用する前と最後に呼び出す必要がありFoo::DeInitialise、一度だけ呼び出されるようにする責任があります(したがって、スレッドセーフの問題について心配する必要はありません)。

これは、この問題の解決策を探すときに私が主に遭遇したアプローチです。ただし、現在、すべての初期化と非初期化をクラスのコンストラクタ/デストラクタに配置することを検討しています。例:

Class Initialiser
{
   Initialiser()
   {
      Bar::Initialise();
      // Do rest of Foo's initialisation
   }
   ~Initialiser()
   {
      Bar::DeInitialise();
      // Do rest of Foo's de-initialisation
   }
}

したがって、ユーザーは非初期化について心配する必要がなくなりInitialiserます。プログラムの開始時にスタック上にオブジェクトを作成するだけで、プログラムの終了時にデストラクタが残りの処理を行います。

私の質問は:これは合理的なアプローチですか?考慮すべき潜在的な落とし穴や代替ソリューションはありますか?コンストラクタとデストラクタだけでデータメンバーがないクラスを持つことも有効ですか?

4

1 に答える 1

4

あなたが思いついたのは、実際にはRAIIと呼ばれるものです-リソース獲得は初期化であり、C++OOPでのプログラミングの中心的な設計概念です。これにより、コードの例外が安全になり、ユーザーが手動で関数を呼び出す必要がなくなります。

これは、コンストラクタ/デストラクタでの仮想関数呼び出しなどの複雑さがない限り、実行したいことを実行する正しい方法です。

于 2013-03-05T02:40:59.007 に答える