我正在第三方库(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
}
}
对象,析构函数将在程序退出时处理其余部分。
我的问题是:这是一种合理的方法吗?是否有任何潜在的陷阱或替代解决方案需要考虑?有一个只有构造函数和析构函数但没有数据成员的类是否有效?
答案 0 :(得分:4)
您提出的内容实际上称为RAII - Resource Acquisition Is Initialization,并且是使用C ++ OOP进行编程的核心设计概念。它使代码异常安全,并使用户无需手动调用函数。
这是执行所需操作的正确方法,只要您没有构造函数/析构函数中的虚函数调用等复杂功能。