代码组织——组织大型c++项目
code organization - Organizing large C++ project
一个项目中所有的c++代码都应该被封装到一个单独的类中,main只是调用这个类吗?或者主函数应该声明变量和类吗?
如果你打算用c++构建一个大型项目,你至少应该阅读John Lakos的《large Scale c++ Software Design》。它有点老了,但听起来你可以从它的基本原理中受益。
请记住,用任何语言构建一个大规模的系统都是一个挑战,需要技巧和纪律来防止它很快崩溃。别掉以轻心。
也就是说,如果你对"大"的定义与我的不同,那么我可能有其他建议给你。我假设你正在谈论一个项目,在这个项目中,单词"million"将在包含单词"lines of code"的句子中被提到。
对于大型c++项目,您应该创建许多类!
main应该只是启动一些事情(可能做一些家务),然后调用一个类来启动系统的其余部分
如果这是一个真正有意义的类,当然——但至少对于IME来说,这是一个相当罕见的例外,而不是一般规则。
在这里,我假设你并不是真的意味着所有的代码都在一个类中,而是有一个单一的顶级类,所以基本上所有main
所做的就是实例化并使用它。这个类,反过来,可能会实例化和使用其他从属类。
如果你真的想问"所有的代码都应该包含在一个类中吗?",那么答案几乎肯定是响亮的"不",除非是非常小的项目。如果所有代码都在一个类中,那么c++(以及大多数其他面向对象语言)中的大部分类设计都是完全没有意义的。
如果您可以将整个项目放在一个类中而不会发疯,那么您对"大型"的定义可能与这里的大多数人不同。这很好——只要记住,当你问别人关于一个"大型"c++项目时,他们会认为你在谈论一个需要好几个人年才能创建的东西。
也就是说,无论项目的大小,相同的封装原则都适用。将你的逻辑和数据分解成有意义的单元,而不是过于捆绑在一起,然后围绕这些单元组织你的课程。如果您发现自己在复制粘贴代码,或者发现一个类过于依赖另一个类,请不要害怕尝试一个组织,然后将其重构到另一个组织中。(或者如果你发现自己有太多的类,并且你要创建许多对象来完成一个任务,那么单个对象对你来说会更干净、更容易。)
玩得开心,不要害怕尝试。
在c++中,你应该避免将整个项目放在一个class
中,无论大小。最多你可以试着把它放在1或2个namespace
(它可以跨文件分割)。拥有多个类的好处是:
- 更好的可维护性
- 将类放在多个。h和。cpp文件中(即小模块)可以帮助您快速调试
- 如果所有代码都在一个类中,并且在某个地方进行了更改,那么必须编译整个项目。相反,如果项目是跨模块的,则只需编译所做更改的模块。它节省时间很多。
不!每个头文件/实现文件对应该代表一个类。将大型项目放在一个文件中肯定会导致灾难:项目变得不可维护,编译将花费很长时间。把你的代码分成适当大小的片段。
main函数不应该声明类,相反,它包含的文件(通常命名为main.cpp, driver.cpp, projectname.cpp)应该使用#include指令使编译器读取头文件中的声明。阅读c++的独立编译模型获取更多信息。
一些c++新手发现编译模型——以及当你搞砸它时产生的错误代码——难以理解或令人生畏,并放弃认为它不值得。不要让这种情况发生在你身上。学习如何正确组织代码
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 从链接列表c++中删除一个项目
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 既然存在危险,为什么项目要使用-I include开关
- cmake在我的项目中所需的所有静态库都不成功
- QT通过C++添加映射QML项目
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在linux上调试巨大的C++项目
- 在其他文件中创建类时在 c++ 项目中不起作用
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 如何维护资源管理器项目视图中当前可见的项目列表
- 错误-我无法在VS2019中打开新的Qt项目
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗