8

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

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

当然,这是我的一个主要问题,它导致了草率、骇人听闻的代码,只有在我把所有基本的 OOP 主体扔出窗口并开始用全局变量填充我的代码、所有东西的前向声明之后,它才能按照我想要的方式工作无处不在,并公开班级成员。

简而言之:我的编程一团糟……C++ 是我的第一种编程语言,即使我尽最大努力以面向对象的方式设计/编写,我最终还是得到了一堆难看的文件,#包括几乎所有内容每个文件,以及很少工作的程序和 OOP 意大利面条代码的奇怪组合!

我自称是编程新手,我承认学习如何构建程序需要时间,但我几乎无计可施!我知道我的问题源于我对 OOP有一点了解。我知道我想编写处理单个任务的独立类。但与此同时,我不明白如何正确地提醒每个类程序其他部分的存在。这有点像知道你应该吃什么样的食物但不知道如何使用叉子......

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

  • 在 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 技能之前,这是一个简单但重要的障碍。我一直在尝试深入思考将类彼此分开的重要性,以至于我不确定如何真正设置我的类/文件以使它们真正相互交互!非常感谢你的帮忙!

4

3 回答 3

4
  • C++ 不仅仅是 OOP,它是多范式。不要试图通过 OO 过滤器按下所有内容,这对 C++ 不利。在一些地方,C++ 可以更优雅地做事,因为您不限于“纯”OO。例如,

  • main()永远不会在一个类中,并且总是在全局范围内。

  • 最重要的规则是“一致性”和“可维护性”。想想你以后会如何看待这个程序,一旦它“完成”并且你想修复几个错误。您将在哪里找到常量并定义最简单的方法?

  • 如果 s 的顺序#include很重要,则您的头文件已损坏。每个标头对于其中声明的内容应该(至少)自给自足。

  • 每个标头一个类声明,每个实现单元一个类定义。文件和类具有相同的名称。真的,这是我认为不可协商的唯一规则。必须grep获取有关某个类的信息比获取find它要麻烦几个数量级。

其余的,真的,可以在每一本关于 C++ 的好书中找到,你真的应该用一本书而不是通过教程和问答页面来穿梭。

于 2012-08-13T12:01:13.157 回答
4

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

设计应用程序的架构是非常重要的,有很多关于它的书籍。您设计应用程序的结构越好,您就越容易编写代码,并且您将遇到的错误就越少。学习一些建模语言的基础知识是一个很好的建议,可以让你更容易地绘制和理解东西。UML 是一个很好的选择。

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

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

  1. 将 main 留在全局范围内。就个人而言,我什至将它放在一个单独的main.cpp文件中以保持清洁,但你把它放在哪里并不重要。

  2. 尽量避免全局变量。如果您需要常量,可以定义它们。是的,您在单个头文件中使用所有定义的方法效果很好。但是,您可能希望按含义将它们分开,而不是将具有 10000 个定义的文件包含到只需要其中一个的 .cpp 中。

  3. 如果您需要在声明之前使用一个类,则必须前向声明它,否则编译器将不知道它的存在。

  4. 包含的顺序确实很重要,因为每个#include基本上都会复制相应文件的文本。因此,如果#includeclass.h在您的 中class.cpp,则标头的文本将被预处理器复制粘贴到源文件中。前向声明的顺序并不重要,只要你在第一次使用前先声明东西。

于 2012-08-13T11:53:42.773 回答
1

好的...所以主要问题似乎是保持文件的OO组织。首先,如果您还没有阅读Google C++ Style Guide,我强烈建议您这样做。我还发现这个先前的答案相当清晰和简单

我希望这有帮助

于 2012-08-13T11:51:35.303 回答