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 的用户将被要求Foo::Initialise在使用它之前和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 - Resource Acquisition Is Initialization,它是 C++ OOP 编程的核心设计理念。它使代码异常安全,并使用户无需手动调用函数。

这是做你想做的事情的正确方法,只要你没有在你的构造函数/析构函数中调用虚函数等复杂情况。

于 2013-03-05T02:40:59.007 回答