从静态库公开一个类
Exposing a class from Static Library
我正在开发一个解析器库,我在其中解析数据并将其存储在不同的数据结构中。库的设计是这样的,它将有一个数据提供者、解析器和数据存储类。数据存储是DataProvider类的成员。使用者需要调用DataProvider中的函数来解析文件并从库中检索数据。
现在,如果我公开DataProvider类,那么我还需要公开DataStore类,它将实现细节提供给消费者。公开DataProvider类的函数的另一种方法是什么?我应该公开函数,如LoadFile, GetRecords,并在cpp内全局创建DataProvider对象吗?
如果用户不需要直接使用DataStore
,最好不要将其暴露。您可以通过创建一个"接口"来实现这一点——只有公共纯虚函数的抽象DataProvider
。在内部,有一个DataProviderImp
,它将继承DataProvider
,并包含所有必需的定义和成员,它们是实际实现的一部分。
让用户只处理抽象类。这样,您只需将最小的依赖项拖拽到您的API中。
首先尽量减少需要在头文件中公开的信息,因此在可能的地方使用前向声明、引用和指针(因此只需要前向声明),并尝试使用PIMPL习惯用法来隐藏实现。
接下来,您可以构建另一个类,它是系统的外观,它封装了函数的入口点,并使用间接方法访问包含的元素(例如可从外部访问的数据元素),例如句柄和索引。
如果担心外部用户可能会创建自己的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
类)并使这些类定义私有/保护DataProvider
来隔离这些子类。另一种方法是将DataStore
中的所有内容设置为private/protected,并将DataProvider
设置为好友类。
由于您正在交付静态库和头文件,因此无论您多么努力地将其隔离,总会有一些令人讨厌的黑客手段来获取您的底层数据和方法。在某些情况下,"This仅供内部使用。把你的脏手拿开!
- 分离一个静态常量 std::thread?
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 如果两个静态库使用相同的另一个静态库,如何避免"LNK2005 Already Defined error"?
- 我可以使用 constexpr 函数声明一个静态数组吗?
- 我正在尝试在我的类中创建一个静态成员,但编译器警告我它是未定义的
- 一个静态变量多副本
- 两个C++库如何共享一个静态缓冲区?
- 为什么静态指针返回函数中有一个"静态"键?
- C++ 给出编译器错误,将一个(静态)常量全局变量设置为另一个静态常量变量
- cmake-创建一个静态库
- 对另一个静态库中静态库方法的未定义引用
- 如何创建一个静态类来引用带有C++的字符串变量
- QMAKE:将静态库链接到另一个静态库
- 长镜头 -- 可能有一个静态类成员,该类成员具有访问非静态成员的 lambda
- 为 c++ 构建一个静态库,该库在内部依赖于第三方库
- 使用类模板参数推导来创建一个静态接口
- 具有两个动态维度和一个静态维度的多维数组
- 创建一个静态包含ffmpeg的共享库
- NetBeans创建一个静态库C
- 在抽象类中,可以使用抽象类A的类型创建一个静态字段