在同一个 C++ header 中声明派生 类 是好的做法吗?
Is it good practice to declare derivate classes in the same C++ header?
我正在声明一个纯虚拟 class,它将为少数派生的 classes 提供一个统一的接口。我本能的组织方式是为基本 class(例如 lib/Base.h
)创建一个带有 header 的基本文件夹,然后为 header + 源文件创建子文件夹派生的 classes(因此 lib/implA/ImplA.h
、lib/implA/ImplA.cpp
等等)。这使文件简短,但感觉混乱。
在 header lib/Base.h
中收集派生的 classes 的定义并将各种实现保存在同一文件夹中是否被认为是一种好的做法?
Two-file 个文件夹(如 lib/implA/ImplA.h
、lib/implA/ImplA.cpp
)是不必要的,对于小型项目,人们通常只是将所有内容都放在 lib/
中。如果 lib/
变得太混乱,请将整个层次结构放在 lib/my_hierarchy/Base.h
、lib/my_hierarchy/ImplA.cpp
等中。也许提取逻辑子系统而不是层次结构。保持合理的文件夹大小和一些有条理的结构。
至于将多个声明放在同一个 header 中,这是您的设计选择。据我所知,在 C++ 中没有关于此的单一“最佳实践”。 C++ 不像 Java 那样强制每个文件一个 class。但是,在单个 header 中包含大量 class 对用户来说意味着编译时间稍长,因为需要在每个 .cpp
文件中解析这么长的 header #include
d。通常人们试图保持他们的 headers 最小化,但也提供了一个方便的“聚合”header,其中包括所有其他 headers(如标准库的 bits/stdc++.h
)。在你的情况下,那将是:
// lib/lib.h
#include "my_hierarchy/Base.h"
#include "my_hierarchy/ImplA.h"
// etc.
以便不介意较长编译时间的用户可以 #include <lib/lib.h>
拥有一切,而其他人 #include
只能 class 他们需要的东西。
不好也不坏。重要的是您想要作为 API 呈现的内容,即用户或您的 类 必须在他们自己的来源中编写的内容。 #include "lib/implA/ImplA.h"
使用 2 目录级别,这不是很常见,但恕我直言也不算太多。如果单个应用程序很少使用多个实现,那么这很有意义。
对于您想要组织 headers 和翻译单元的方式,这实际上是一个 合理 大小的问题。而且团队之间的数量顺序可能会有所不同...
我正在声明一个纯虚拟 class,它将为少数派生的 classes 提供一个统一的接口。我本能的组织方式是为基本 class(例如 lib/Base.h
)创建一个带有 header 的基本文件夹,然后为 header + 源文件创建子文件夹派生的 classes(因此 lib/implA/ImplA.h
、lib/implA/ImplA.cpp
等等)。这使文件简短,但感觉混乱。
在 header lib/Base.h
中收集派生的 classes 的定义并将各种实现保存在同一文件夹中是否被认为是一种好的做法?
Two-file 个文件夹(如 lib/implA/ImplA.h
、lib/implA/ImplA.cpp
)是不必要的,对于小型项目,人们通常只是将所有内容都放在 lib/
中。如果 lib/
变得太混乱,请将整个层次结构放在 lib/my_hierarchy/Base.h
、lib/my_hierarchy/ImplA.cpp
等中。也许提取逻辑子系统而不是层次结构。保持合理的文件夹大小和一些有条理的结构。
至于将多个声明放在同一个 header 中,这是您的设计选择。据我所知,在 C++ 中没有关于此的单一“最佳实践”。 C++ 不像 Java 那样强制每个文件一个 class。但是,在单个 header 中包含大量 class 对用户来说意味着编译时间稍长,因为需要在每个 .cpp
文件中解析这么长的 header #include
d。通常人们试图保持他们的 headers 最小化,但也提供了一个方便的“聚合”header,其中包括所有其他 headers(如标准库的 bits/stdc++.h
)。在你的情况下,那将是:
// lib/lib.h
#include "my_hierarchy/Base.h"
#include "my_hierarchy/ImplA.h"
// etc.
以便不介意较长编译时间的用户可以 #include <lib/lib.h>
拥有一切,而其他人 #include
只能 class 他们需要的东西。
不好也不坏。重要的是您想要作为 API 呈现的内容,即用户或您的 类 必须在他们自己的来源中编写的内容。 #include "lib/implA/ImplA.h"
使用 2 目录级别,这不是很常见,但恕我直言也不算太多。如果单个应用程序很少使用多个实现,那么这很有意义。
对于您想要组织 headers 和翻译单元的方式,这实际上是一个 合理 大小的问题。而且团队之间的数量顺序可能会有所不同...