c++ - 如何正确构建 OOP 和多文件项目?

标签 c++ oop interface header abstraction

作为一名初级程序员,刚刚学习 OOP 的基础知识,我在练习程序的基本包含结构方面遇到了许多问题。我一直在使用各种书面和在线资源自学编程。但是,这是我的问题(嗯,其中之一......):

一方面,我理解抽象、封装和类之间低耦合度的重要性,但另一方面,我一直在努力构建我的程序并以一种允许不同的方式设计我的类。不同文件中的类以相互了解。

当然,这是我的一个主要问题,它导致了草率的、骇人听闻的代码,只有在我将每个基本的主要 OOP 抛出窗口并开始用全局变量填充我的代码,所有内容的前向声明之后,它才能以我想要的方式工作无处不在,并让类(class)成员公开。

简单地说:我的编程一团糟...... C++ 是我的第一种编程语言,即使我尽力以面向对象的方式设计/编写,我最终还是得到了一堆丑陋的文件,#包括几乎所有的东西每个文件,以及很少工作的过程和 OOP 意大利面条式代码的奇怪组合!

我自称是一个编程新手,我承认学习如何构建程序需要时间,但我快没脑子了!我知道我的问题源于我知道一个 的事实。一点点关于面向对象。我知道我想编写处理单个任务的独立类。但同时,我不明白如何正确地提醒每个类程序其他部分的存在。这有点像知道应该吃什么样的食物但不知道如何使用 fork ......

简而言之,这就是我的问题。并进一步跟进我提出的一些更具体的问题:

  • 在 C++ 多文件项目中,将 main() 函数放在自己的类中是否正常/需要?或者将 main() 留在全局范围内是标准的事情吗?
  • 在我以前用 C++ 编写的过程程序中,在 main.cpp 文件的顶部,在全局范围内有一个常量变量或 #defines 并不少见。例如,可能会在程序开始时定义屏幕尺寸或其他有用信息。在 OOP 中会发生什么?是否要完全避免这种做法?或者我是否制作了一个 MAIN.H 文件并将其 #include 到项目中的每个其他标题中?我不知道该怎么办...
  • 在编写我的第一个中型实践 OOP 程序时,当我开始尝试编写 StateMachine 类时,我的工作戛然而止。我的意图是让 StateMachine 类包含程序将使用的所有可能的屏幕状态。然而,出现了一个问题,即我的 StateMachine 类似乎不知道我的其他一些 State 类,即使它们都被#included。我以前见过有人做类的前向声明,有必要吗?我应该到处乱发类的前向声明还是代码有异味?
  • 最后,#include 和前向声明命令的顺序重要吗?

  • 我知道这可能是一个非常基本的问题,但在我从单文件程序 C++ 初学者程序过渡到多文件 OOP 编程的过程中,这让我非常困难。是否有一些通用的经验法则来构建您的程序,以便一切正常?我一直在使用包含守卫,所以有什么理由不能只#include 每个源文件中的每个头文件?我应该在每个类的每个头文件中都有一个 #included 的 common.h 文件吗?

    我非常感谢社区可以给我的任何帮助/建议。我知道这是一个简单但重要的障碍,在我开始发展我的 OOP 技能之前,我需要通过。我一直试图在我的大脑中深入了解将类彼此分开的重要性,以至于我不确定如何真正设置我的类/文件以允许它们真正相互交互!非常感谢你的帮忙!

    最佳答案

    您不能将 OOP 视为带有类的普通函数式编程。这是一种错误的方法,它会误导您。

    设计应用程序的架构非常重要,有很多关于它的书。应用程序的结构设计得越好,编码就越容易,并且出现的错误就越少。学习一些建模语言的基础知识是一个很好的建议,以便您更轻松地绘制和理解内容。 UML 是它的绝佳选择。

    有两种设计大东西的方法。你可以下降,这意味着你从一个高抽象层次开始,然后下降,缩小你的问题。或者你可以上升,从实现容易做的小事情开始,然后上升,将你的小模块连接到一个应用程序中。

    你可以很容易地在网上找到很多关于它的信息。简而言之。现在,针对您的具体问题。

  • 将 main 保留在全局范围内。就个人而言,我什至把它放在一个单独的 main.cpp 中。文件以保持清洁,但您把它放在哪里并不重要。
  • 尽量避免使用全局变量。如果你需要常量,定义它们就可以了。是的,您在单个头文件中使用所有定义的方法效果很好。但是,您可能希望按含义将它们分开,而不是将具有 10000 个定义的文件包含到只需要其中一个定义的 .cpp 中。
  • 如果您需要在声明之前使用一个类,则必须向前声明它,否则编译器将不知道它的存在。
  • 包含的顺序很重要,因为每个 #include基本上是复制相应文件的文本。所以如果你 #include您的 class.h在您的 class.cpp ,标题的文本将被预处理器复制粘贴到源文件中。只要在第一次使用之前先声明内容,前向声明的顺序并不重要。
  • 关于c++ - 如何正确构建 OOP 和多文件项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11933522/

    相关文章:

    c++ - 如何防止 c++ asio tcp 服务器关闭?

    c++ - 具有捕获引用的长生命周期(非本地)lambda

    java - 传递到方法中的对象是否需要返回才能更改?

    c# - 为什么java中的嵌套类与C#中的嵌套类在以下方面有所不同?

    c# - 为什么接受实现私有(private)接口(interface)方法?

    c++ - WritePrivateProfileString 没有在末尾添加属性

    c++ - Arch Linux 中没有 OpenGL 3 头文件

    c++ - 错误 : expected primary-expression before ‘.’ token

    c# - 接口(interface)方法 使用 VB.NET 的 ByRef 实现和传递

    angular - 如何将 http 请求响应映射到我在 TypeScript 中定义的对象