C++ 这是初始化我的库的合理方式吗?

C++ 这是初始化我的库的合理方式吗?,c++,initialization,C++,Initialization,我正在第三方库栏上构建一个库Foo,它要求在任何使用它的程序开始时调用一个无初始化函数,在结束时调用一个去初始化函数。我想将这些函数级联到我的库中,这样用户就需要初始化我的函数,而不需要知道任何关于第三方库初始化的信息。此外,我可以在同一位置执行我的库可能需要的任何其他初始化。我可以使用我的第三方库的方法使用免费函数,例如: namespace Foo { Initialise() { Bar::Initialise(); // Do rest of Foo'

我正在第三方库栏上构建一个库Foo,它要求在任何使用它的程序开始时调用一个无初始化函数,在结束时调用一个去初始化函数。我想将这些函数级联到我的库中,这样用户就需要初始化我的函数,而不需要知道任何关于第三方库初始化的信息。此外,我可以在同一位置执行我的库可能需要的任何其他初始化。我可以使用我的第三方库的方法使用免费函数,例如:

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对象,当程序退出时,析构函数将处理其余部分


我的问题是:这是一个合理的方法吗?有没有潜在的陷阱或可供选择的解决方案?如果只有一个构造函数和一个析构函数但没有数据成员的类,它是有效的吗?

< p>你所提出的是事实上的调用,并且是C++中面向对象编程的设计概念。它使代码异常安全,并避免用户需要手动调用函数


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

你所提出的是事实上被调用的,并且是C++中面向对象编程的设计概念。它使代码异常安全,并避免用户需要手动调用函数


这是做您想做的事情的正确方法,只要您的构造函数/析构函数中没有诸如虚拟函数调用之类的复杂情况。

谢谢。至于我的最后一个问题——一个包含ctor/dtor但没有数据成员的类是否有效?@JBentley:是的,它完全有效。@JBentley取决于您所说的有效。它是100%从C++ PoV中得到的,稍微从设计POV中得到,如果它主要是用于其他库的RAII包装器,它是可以理解的。确保您的成员函数不是静态的,以强制用户创建对象。谢谢。至于我的最后一个问题——一个包含ctor/dtor但没有数据成员的类是否有效?@JBentley:是的,它完全有效。@JBentley取决于您所说的有效。它是100%从C++ PoV中得到的,稍微从设计POV中得到,如果它主要是用于其他库的RAII包装器,它是可以理解的。确保成员函数不是静态的,以强制用户创建对象。