在像 OpenCV 这样成熟的 C++ 库中添加或修改单个类方法的最佳实践是什么,同时仍然重用库代码的其余部分,最好是 lib 格式。
在这一点上,我知道的唯一方法是将属于特定库(假设是 OpenCV 的核心库)的所有源文件和头文件复制到当前源文件夹,修改那个函数并用其余的重新编译模块的代码。理想情况下,我希望能够按原样链接所有当前 .lib 文件,但只需为这些库中定义的类定义一个新方法(或修改当前方法),我的方法实现将取代该方法默认库文件的实现。
继承似乎并不总是一种选择,因为有时基类具有正确的继承类实现所需的私有(private)成员。
最佳答案
我不知道在 C++ 中有一种干净的方法来完成您的要求。你真正要求做的(假定你需要使用或修改私有(private)方法)是违反封装的,而 C++ 语言旨在不允许你这样做。
存在几个选项:
.lib
文件只是.obj
文件的集合。您的编译器工具链应该有一个命令行程序,用于添加、删除和替换.lib
中的.obj
文件,因此您可以构建一个或两个。 obj
文件并将它们合并到.lib
中。我怀疑这个解决方案会很丑陋和脆弱。- 如果库没有做和应该做的事情,那么您总是有机会向库作者提交补丁或功能请求以进行更改。当然,如果它能奏效的话,这可能需要一段时间。
- 作为@fatih_k建议,将您的更改添加为 friend 类会起作用。如果您对 OpenCV 所做的唯一更改是将
friend
行添加到头文件,那么库的 ABI将保持不变,您不必触摸.lib
。 - 最简洁的选择是简单地接受您需要修改 OpenCV 库并跟踪其源代码,连同您的修改以及您自己开发的源代码,并将它与您自己构建的源代码一起构建。这是一种非常常见的方法,有多种模式和技术可以帮助您做到这一点;例如,Subversion 有 vendor branches 的概念.这种方法需要更多的设置工作,但从长远来看绝对是最干净的。
关于c++ - 部分更改 C++ 库同时保持库的其余部分完整的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15640035/