在我的项目中,我使用的是不断变化的第三方库。我有一个这个库的包装类(Bridge模式+ Pimpl模式)。因此,除了包装器实现之外,我的所有源都没有看到该库。 该库有一个Options结构,例如
struct Options {
double distance;
double weight;
int num_rabbits;
// etc
};
我希望这个结构在GUI模块中可用,以构建一个允许设置这些选项的对话框。我需要为它创建一个包装器结构吗? E.g。
struct MP_ThatLibOptions {
// exact member copy
double distance;
double weight;
int num_rabbits;
// etc
};
或者我应该直接将结构头包含在我的源代码中?
包装器的缺点是:复制粘贴,用于在结构之间进行转换的附加代码。 直接包括的缺点是:打破pimpl习语。
这个问题可能还有其他解决办法吗?
另外我想强调第三方库不断变化,所以我必须采用我的资源来支持每个新版本的库。
答案 0 :(得分:1)
Options结构似乎是公共API的一部分,而不是pimpl习惯用法隐藏的私有实现,所以看起来你应该在你的源代码中包含标题。
如果你这样做,唯一可能在第三方代码发生变化时破损的代码就是直接使用Options结构成员的代码,但大概是当这种代码发生变化时,你的代码无论如何都需要适当改变。这听起来像是一个API改变,所以看起来你已经被覆盖了。
答案 1 :(得分:1)
当我使用Bridge + pimpl模式时,我决定完全隐藏第三方库。