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

时间:2013-03-05 02:34:27

标签: c++ initialization

我正在第三方库(Bar)上构建一个库(Foo),它需要在任何使用它的程序的开头调用Initialise()个自由函数,并且{{1最后的功能。我想将这些功能“级联”到我的库中,以便用户需要初始化我的,而无需了解第三方库的初始化。另外,我可以在同一个地方执行我的库可能需要的任何其他初始化。我可以使用我的第三方库使用免费功能的方法,例如:

DeInitialise()

然后,Foo的用户在使用之前需要先致电namespace Foo { Initialise() { Bar::Initialise(); // Do rest of Foo's initialisation } DeInitialise() { Bar::DeInitialise(); // Do rest of Foo's de-initialisation } } 并在最后使用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 } } 对象,析构函数将在程序退出时处理其余部分。

我的问题是:这是一种合理的方法吗?是否有任何潜在的陷阱或替代解决方案需要考虑?有一个只有构造函数和析构函数但没有数据成员的类是否有效?

1 个答案:

答案 0 :(得分:4)

您提出的内容实际上称为RAII - Resource Acquisition Is Initialization,并且是使用C ++ OOP进行编程的核心设计概念。它使代码异常安全,并使用户无需手动调用函数。

这是执行所需操作的正确方法,只要您没有构造函数/析构函数中的虚函数调用等复杂功能。