c++ - 创建具有多个类的库的推荐方法是什么?

标签 c++ qt

我是 C++ 的新手(之前有 Python 经验并涉足 Java),我正在编写一个小程序作为熟悉项目。作为程序的一部分,我正在编写一个类来解码一些数据,并最终将编写一个类似的类来执行编码。代码是我确信我会经常重复使用的东西,并且认为创建一个库作为项目的一部分会很有趣。 我的问题是,创建库的最佳实践是什么?

编辑:(修订)

问出这个问题后,我才知道自己不知道自己不知道什么。我做了更多研究,这应该有助于使我的问题更具体:

  • 我正在使用 Qt Creator 进行开发。因此,与 Qt 相关的细节会有所帮助,但不是必需的。
  • 我在 Qt (MyCodec) 中创建了一个新的静态库项目,该项目目前定义了一个名为 MyDecoder 的类。
  • 作为一个库,我的假设是,要添加 MyEncoder,我只需创建另一个类/头文件。
  • 接下来会发生什么是我不确定的地方。我只是建立图书馆吗?我的理解是它将创建(在 Windows 中)一个 .lib 和一个 .h 文件。在此步骤之前我应该​​做些什么吗?是否有选项会影响我与之交互的方式?
  • 我是否只在我的程序中包含该头文件以访问我编写的两个类?
  • 我找到了很多有关在 Qt 中将 .lib 文件添加到项目的答案,因此我不需要这些信息。

原始问题:(针对上下文)

我最初的想法是创建包含 MyEncoder 和 MyDecoder 类的 MyLib 是最方便的。

  • 如果我这样做,我是否只在 header 中声明两个类?

  • 为了可移植性和体验,我想从这个库中创建一个 DLL。我确信那里有很多关于创建和使用 DLL 的信息(这不是这个问题的主题),但如果有特别好的教程(针对 Qt),请将其传递。

    <
  • 我的假设是,对于此实现,最好为 MyEncoder 和 MyDecoder 使用单独的命名空间,而不是为 MyLib 使用一个命名空间?

我可以看到这种方法的一个权衡是应用程序的大小,因为包含 MyLib.h 将包含编码器和解码器的代码(如果编码器和解码器是单独的应用程序)。这是假设我没有使用 DLL。

我想我的意思是:

  • 有哪些可用(和推荐)的方法?
  • 各自的优缺点是什么?
  • 我在哪里可以找到关于这个特定主题的文档(教程/示例)?我的搜索工作没有产生太多结果。

如果说得更具体些,我正在 Qt Creator 中使用 Qt 4.7.4 进行开发。

最佳答案

C++ 中关于库的一个“最佳实践”通常是“按使用量付费”。

这如何适用于您的问题是您将 MyEncoder 和 MyDecoder 放在单独的头文件中。因此,如果用户想使用 MyEncoder,他会包含 MyEncoder.h,如果他想使用 MyDecoder,他会包含 MyDecoder.h,如果他想同时使用两者,他会包含两个 header 。

链接器通常只包含您在可执行文件中使用的代码部分,因此就代码大小而言没有任何损失,但编译时间会有损失,特别是如果您开始使用高级模板技术在你的类里面。在大型项目中,编译时间可能会变得很长,因此能够仅包含您将要使用的内容非常重要。

当然,有时将所有内容都包含在一个标题中也很方便。所以你可以拥有的是:

  • MyEncoder.h
  • MyDecoder.h
  • MyCodec.h

然后 MyCodec.h 可以包含 MyEncoder.h 和 MyDecoder.h

可能没有充分的理由将 MyEncoder 和 MyDecoder 放在不同的命名空间中,假设它们旨在对相同类型的数据进行操作。

您可能希望拥有类似 MyCodec 命名空间的内容,并在该命名空间内声明 MyEncoder 和 MyDecoder。

已针对您的修订更新:

As a library, my assumption is that, to add MyEncoder, I just create another class/header file.

这是一个正确的假设。

What happens next is where I am uncertain. Do I just build the library? My understanding is that it will create (in Windows) a .lib and a .h file. Is there something I should do before this step? Are there options that will affect the way I interact with it?

我已经有一段时间没有使用Qt creator了,所以我不能权威地谈论它或者如何访问相关的选项。但作为一般规则,您将希望至少拥有 2 个版本的库;调试版本和发布版本。如果您的库使用 Qt 库,那么当应用程序链接到您的库的调试版本时,它们将需要在其路径中包含 Qt 共享库的调试版本,如果它们链接到您的发布版本,则它们将需要拥有 Qt 库的发布版本。

也可能有关于您是要静态链接到 C++ 标准运行时库还是动态链接到 DLL 的选项。

但本质上是的,您只需构建库,然后使用它的应用程序会将库链接到可执行文件。

Do I just include that header file in my program to access both classes that I wrote?

您包含头文件,并链接到 .lib 文件。这就是您需要做的所有事情。

关于c++ - 创建具有多个类的库的推荐方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8883410/

相关文章:

c++ - C#/C++ 异步反向 pinvoke?

c++ - 传递值作为对构造函数/函数的引用

Qt - 将 int 转换为文件大小格式(KB、MB 或 GB)的最简单方法?

c++ - 在 Qt C++ 中使用 Dll

qt - 通过代码推广小部件

c++ - 与通过引用传递指针相比,在指针上使用reference_wrapper有好处吗?

python - 调整QHBoxLayout的宽度

c++ - 如何反转 QSlider 的范围

c++ - 结构与类

c++ - 与链接库的 Makefile 混淆,该库似乎链接但我无法调用