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

时间:2012-08-13 11:36:38

标签: c++ oop interface header abstraction

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

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

当然,这是我的一个主要问题,导致了草率,hackish代码,只有在我将每个基本的主要OOP抛出窗口并开始用全局变量填充我的代码后才能按照我想要的方式运行宣传所有地方的一切,并使集体成员公开。

简单地说:我的编程很乱...... C ++是我的第一个编程语言,即使我尽力以面向对象的方式设计/编写,我最终得到了一个丑陋的文件,#包括几乎每个文件中的所有内容,以及程序和OOP意粉代码的奇怪组合,很少有效!

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

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

  • 在C ++多文件项目中,将main()函数放在自己的类中是正常/需要的吗?或者将main()留在全局范围内是标准的事情吗?

  • 在我以前用C ++编写的程序程序中,在main.cpp文件的顶部,在全局作用域中有一个常量变量或#defines并不罕见。例如,可能在程序开始时定义屏幕的尺寸或其他有用信息。 OOP会发生什么?是否完全避免了这种做法?或者我是否在项目的每个其他标题中创建MAIN.H文件并将其包含在内?我不知道该怎么办......

  • 在编写我的第一个中等规模练习OOP程序时,当我开始尝试编写StateMachine类时,我的工作开始戛然而止。我打算让StateMachine类包含程序将使用的所有可能的屏幕状态。然而,出现了一个问题,即我的StateMachine类似乎没有意识到我的其他一些State类,即使它们都是#included。我见过人们之前做过类的前进声明,是否有必要?我是否应该在整个地方发送垃圾邮件进行类别的前向声明,或者是代码味道?

  • 最后,#include和forward声明命令的顺序是否重要?

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

我非常感谢社区给予我的任何帮助/建议。我知道在我开始发展我的OOP技能之前,这是一个简单而重要的障碍。我一直试图深入了解保持课程彼此分离的重要性,以至于我不确定如何以一种允许他们真正互相交流的方式真正设置我的课程/文件!非常感谢你的帮助!

3 个答案:

答案 0 :(得分:4)

您不能将OOP视为使用类的正常函数编程。这是一种错误的做法,它会误导你。

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

设计大件的方法有两种。你可以下降,这意味着你从高水平的抽象开始,然后向下,缩小你的问题。或者你可以提升,从实现易于做的小事做起,然后上升,将你的小模块连接到一个应用程序。

您可以在网上轻松找到有关该信息的大量信息。简而言之。现在,针对您的具体问题。

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

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

  3. 如果你需要在声明之前使用一个类,你必须向前声明它,否则编译器不会知道它在那里。

  4. 包含的顺序很重要,因为每个#include基本上都会复制相应文件的文本。因此,如果您#include中的class.h class.cpp,则标题的文本将由预处理器复制粘贴到源文件中。只要您在首次使用之前转发声明内容,前向声明的顺序并不重要。

答案 1 :(得分:4)

  • C ++超过OOP,它是多范式。不要试图通过OO过滤器按下所有东西,这对C ++来说是一种伤害。在某些地方,C ++可以更优雅地做事,因为你仅限于“纯”OO。例如,

  • main()在类中是从不,并且始终在全局范围内。

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

  • 如果#include的序列很重要,那么您的头文件就会被破坏。对于在其中声明的事物,每个标题应该(最低限度地)自给自足。

  • 每个标头一个类声明,每个实现单元一个类定义。文件和类具有相同的名称。真的,这是我认为不可谈判的唯一规则。必须grep获取有关课程的信息比find更加不方便。

其余的,真的,可以在每本关于C ++的好书中找到,你真的应该用一本书来代替通过教程和Q& A页面的方式。

答案 2 :(得分:1)

好的......所以主要的问题似乎是保留你文件的OO组织。 首先,如果你还没有阅读Google C++ Style Guide,我会强烈建议你这样做。我还发现this之前的答案相当简单明了

我希望这个帮助