从静态库中公开一个类

时间:2011-10-13 10:17:16

标签: c++ oop winapi static-libraries

我正在开发一个解析器库,我解析数据并将其存储在不同的数据结构中。该库的设计使其具有DataProvider,Parser和DataStore类。 DataStore是DataProvider类的memebr。使用者需要调用DataProvider中的函数来解析文件并从库中检索数据。

现在,如果我公开DataProvider类,那么我还需要公开DataStore类,它给消费者提供了实现细节。公开DataProvider类函数的另一种方法是什么?我应该公开像LoadFile,GetRecords这样的函数,并在cpp中全局创建DataProvider对象吗?

3 个答案:

答案 0 :(得分:1)

如果用户不必直接使用DataStore,最好不要暴露。您可以通过创建一个“接口” - 仅使用公共纯虚函数的抽象DataProvider来实现这一目标。在内部,有一个DataProviderImp将继承DataProvider,并包含所有必需的定义和成员,这些都是实际实现的一部分。

让用户只使用抽象类。这样,您只将最小的依赖项拖到API中。

答案 1 :(得分:0)

首先最小化需要在头文件中公开的信息,因此尽可能使用前向声明,引用和指针(因此只需要前向声明),并尝试使用PIMPL惯用法隐藏实现。

接下来,您可以构建另一个类,它是系统的外观,它包含函数的入口点,并使用间接方法来访问包含的元素(例如外部可访问的数据元素),例如句柄和索引。

答案 2 :(得分:0)

如果担心外部用户可能会创建自己的DataStore个对象,请在DataProvider的上下文之外使用它们,并且他们抱怨您的库不起作用,有一个简单的解决方案还有一些不太容易的解决方案。

简单的解决方案:DataProvider是您库的外部接口的文档。这是C ++标准库和Boost中使用的解决方案。 std::map的接口是头文件<map>。标头#includes的实现文件以及<map>及其子标头创建的基础数据类型都不属于您的业务。您应该只使用std::map公共接口。使用内部数据类型,您将进入未定义行为的世界。像// The class DataStore is for internal use only. Use it and you will be fired.这样的评论可以起到相当强大的威慑作用。

不依赖于上述内容的解决方案:通过在DataProvider中定义它们来隔离这些子类(例如,您将拥有类DataProvider::DataStore)并将这些类定义设为private / protected to { {1}}。另一种方法是将DataProvider中的所有内容设为私有/受保护,并使DataStore成为朋友类。

由于您提供的是静态库和标题,因此无论您多么努力地设置它们,总会有一些讨厌的hackish手段来获取您的基础数据和方法。在某些时候,“这仅供内部使用。保持你的脏手套!”方法有相当多的优点。