当可以将多个源文件与单个 header 一起使用时

When it's OK to use multiple source files with a single header

One header for multiple cpp-files

我读了这个,我想我明白了以后可能出现的问题。然而,尽管如此,我相信我的问题 可能 是一个特例,我想知道是否有人有不同的建议。

我做了很长时间的服务器和客户端,原本应该是all-encompassing "CommandManager" class的东西变成了可怕的怪物。它的目的是拦截可能从数百个客户端收到的消息,将其解析出来,弄清楚命令是什么,然后将其发送到右侧所需的功能 class.

这是通过在解码 header 后过滤掉消息,然后将接收到的 "plain text" 命令与 std::map pre-loaded 与所有命令相匹配来完成的。

这意味着对于我执行的每个不同的命令,我都需要一个匹配的成员函数。最初效果很好......但现在我有超过 100 个命令,而且我什至没有接近完成。我在 .cpp 文件中达到了 4,000 行代码,我开始难以跟踪所有代码。尽管有不错的命名标准,但它正在成为 catch-all 很多我希望散布的代码。

我仍然认为自己是一般编程和 C++ 的大新手。

有没有其他人运行在过去设计大型项目时遇到过这些问题,他们做了什么来解决这些问题?

实现代码分散在多个 .cpp 文件中的主要原因是工具生成了部分代码。

原则上没有问题

没有规则规定 class 的所有成员函数都必须驻留在同一个源文件中。只要它们都包含定义 class 的相同头文件,它们都可以根据需要相互引用。

我建议将成员函数按其功能分开。例如,一个文件包含与网络相关的成员,一个文件处理解析,一个文件处理处理等。如果您有任何仅供一两个其他成员使用的私有成员,请将它们也放在一起。

(...) what was originally supposed to be the all-encompassing "CommandManager" class has become a terrible monster.

这通常发生在所谓的 "manager" classes 中。根据经验,我会单独说 "manager" 这个词通常表明您不确定 class 的确切目的是什么,最终允许 class 演变成您在这里描述的内容.

This worked out fine originally.. but now I'm at over 100 commands, and I'm not even close to done. I'm reaching 4,000 lines of code in the .cpp file, and I'm starting to have issues keeping track of it all.

听起来很糟糕。

Has anyone else ran into this problems in the past while designing a large project,

是的,各位。这是一个非常普遍的问题。虽然每个人以前都遇到过这个问题,但可悲的事实是大多数开发人员都没有意识到这是一个问题。这意味着您不再是 "big novice in programming",而是已经向前迈出了重要的一步。

and what have they done to fix these issues?

重新设计程序,将大 class 拆分为具有更专业功能的较小 classes。

现在所有的复杂性都集中在一个文件中这一事实只是真正问题的一个症状,而真正的问题是存在一个整体class。从技术上讲,C++ 没有限制 应将多少个函数定义放入单个翻译单元(阅读:"into a single *.cpp file")。但我认为在您的情况下,将实现拆分为多个文件并不能真正解决任何问题,只会增加复杂性。 YMMV.

请注意,C++ 标准确实有一个关于实现数量的附件,但它是一个信息性附件。这是附件 B,上面写着:

Because computers are finite, C++ implementations are inevitably limited in the size of the programs they can successfully process.

(...)

The bracketed number following each quantity is recommended as the minimum for that quantity. However, these quantities are only guidelines and do not determine compliance.

对您来说,一个有趣的指南是:

Members declared in a single class [4 096].

因此,如您所见,您还远未达到 可能 变得关键的成员数量。您有风格或程序设计问题,而不是技术难题。