【问题标题】:Header and cpp or just cpp files - best practise?标头和 cpp 或只是 cpp 文件 - 最佳实践?
【发布时间】:2015-02-21 17:59:28
【问题描述】:

环顾不同的代码库,我看到了各种风格:

  1. 头文件中定义的类“接口”和 cpp 文件中的实际 impl。在这种方法中,标头看起来定义明确且易于阅读,但 cpp 文件看起来令人困惑,因为它只是一个方法列表。

  2. 我看到的第二种方法是将所有内容放在单个类 cpp 文件中。这些类文件包含类定义主体中的定义和实际方法实现。这种方法在我看来更好(更像 Java 和 c#)。

我应该使用哪种样式?

【问题讨论】:

  • 你将如何使用第二个 CPP 文件访问你的课程?
  • 没错。第二种方法只有在您将所有内容都放在一个巨大的 cpp 文件中时才有效。这不是一个好主意。

标签: c++


【解决方案1】:

除了最简单的程序之外,样式#2 根本不可能。如果您 #include 一个具有来自多个其他 .cpp 文件的函数定义的 .cpp 文件,则这些定义将添加到多个目标文件 (.o / .obj) 并且链接器将抱怨符号冲突。

使用第 1 种风格并学会忍受混乱。

【讨论】:

    【解决方案2】:

    前者 - 头文件中的接口和实现文件中的类主体。在大型系统上工作时,您会发现这会给您带来更少的问题。

    In C++ why have header files and cpp files?

    【讨论】:

      【解决方案3】:

      C++ 不使用“接口”,而是使用类——基类/派生类。如果项目很小,我使用一个文件来定义类/及其实现方法,如果项目很大,我使用单独的文件。 在java中,我将它们打包成一个包,然后在需要时将其导入。

      【讨论】:

        【解决方案4】:

        由于您使用 c++ 标记,请选择第一种样式。我不觉得它令人困惑,对于 Java 程序员来说,它可能看起来不同,但在 C++ 中,你总是会使用这种方法。

        事实上,在我最喜欢的 IDE (MSVS) 中,我并排打开头文件和 cpp 文件。使查找原型和类声明变得容易。

        当你有十几节课时;一打 .h 文件和另外一打 .cpp 文件将使您的工作更简单。因为,当您只想查看一个类的作用时,您只需打开相关的 .h 文件,然后查看类成员,也许还有简短的 cmets。您无需费力地阅读几行深度代码。

        结论:您提供的样式选项仅适用于小代码,通常是单个文件,方法很少等。否则,它甚至不是一个选项。 (@Thomas 给出了为什么 #2 甚至不是一个选项的原因)

        【讨论】:

          【解决方案5】:

          标题 (HPP):
          标头包含代码的声明,尤其是函数声明。从技术上讲,类在头文件中定义,但同样,成员函数只是被声明。

          其他文件中的代码将仅包含此标头并从那里保留所有必要的信息。

          实施 (CPP):
          实现包括函数、成员函数和变量的定义。

          理由:

          • 头文件为开发人员(代码的外部用户)提供了一个简单的概述,并且只提供了外部可用代码(即易于阅读,仅提供用户所需的信息)。
          • 头文件允许编译器检查实现的正确性
          • 头文件允许编译器检查外部代码的正确性
          • 头文件允许单独编译。你需要记住。在过去,计算机没有足够的资源在编译过程中将所有内容保存在主内存中。头文件很小,而实现文件很大。

          使用#style 1,即使是简单的程序。因此,您可以轻松学习使用。这在今天可能看起来已经过时了,尤其是在现代多通道编译器的背景下。但即使在今天,单独的头文件也是有益的。关于下一个 C++ 标准的谣言出现了,据我所知,符号导出(Java 或 C#)之类的东西是可能的。但是不要把我钉在这上面!

          注意事项:
          - 在类中定义的成员函数默认为内联,通常你不希望这样
          - 使用始终定义的警卫

          【讨论】:

            【解决方案6】:

            如果您正在开发大型项目,您会发现第一种方法对您有很大帮助。第二种方法可能会在小项目中帮助您。随着您的项目变得越来越大,复杂性管理是软件开发的一个大问题,而第一种方法被证明是更好的选择。

            【讨论】:

              【解决方案7】:

              我做的是:

              这样我得到:

              • 快速编译(只需要重新编译.cpp文件,除非我改变类接口)
              • 循环声明的几个问题
              • 可以接受的低乏味无脑手动工作:-)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-02-12
                • 2011-01-22
                • 2013-03-03
                • 2023-03-20
                • 1970-01-01
                • 2014-07-22
                相关资源
                最近更新 更多