【问题标题】:Should I put classes in separate files in C++? [closed]我应该将类放在 C++ 中的单独文件中吗? [关闭]
【发布时间】:2011-04-05 11:23:27
【问题描述】:

我问这个问题是为了组织我的代码。

【问题讨论】:

  • 你最好根据你的编译器能做什么来调用。为项目中的每个单独的类加载和初始化它可能会导致相当残酷的编译时间。
  • @paperjam:我使用 .cpp 文件的唯一原因(好吧,每个可执行文件都使用第一个)是为了我的编译器的利益,所以是的,我在组织我的项目时要牢记如何他们建造。我希望 Hans 能做到,这就是 C++ 中的生活。
  • @Steve Jessop 好点,但多个 cpp 文件的另一个用途是命名空间分离。例如,防止 污染可移植代码的命名空间。其他人类利益也是如此。有趣的讨论。
  • @paperjam:是的,公平点,当标头在全局命名空间中放置任何东西(包括为此目的的宏)时,就会出现这种情况,尤其是windows.h,因为它破坏了一些标准的东西。所以我夸大了一点,但是单独文件的组织优势可以通过单独的标题来实现。很多时候,专门使用 .cpp 文件而不是将几乎所有内容都粘贴在标头中的原因是为了获得体面的增量重建。因此,不幸的是,构建时间是一个问题。

标签: c++ file class


【解决方案1】:

C 和 C++ 约定是每个库或库的部分一个头文件,而不是每个类一个头文件。尝试将相关的类组合在一起。例如,在标准库中<set> 包含std::setstd::multi_set,但它们是做非常相似的事情的模板。

但是,对于公共头文件并没有任何真正一致的规则 - Boost.asio 有一个很大的头文件,其中包含很多内容。 Boost.DateTime 被合理地划分得很远,尽管仍然没有达到单一类型的水平。

如果您愿意,您可以将成员函数的实现放在每个类的一个源文件中。如果您遵循 GNU C 风格,甚至每个函数只有一个源文件,尽管我认为我不建议将其用于 C++。而且您始终可以通过让它们包含多个单独的头文件来实现面向公众的头文件。

它可能与其他任何事情一样取决于您的版本控制和构建过程 - 更改一个类很方便,而无需触及任何包含与该类无关的任何文件,从那时起,最低限度的重建和更改日志清楚地识别了哪些更改从文件名。但类不一定是所谓“不相关代码”的边界。

例如,如果您正在编写带有迭代器的集合,或者在某个框架中注册侦听器的类,其中侦听器将作用于主类,那么将它们分开就没有多大意义。从道德上讲,这些都是“内部类”,即使您没有在 C++ 中将它们实现为嵌套类。

【讨论】:

  • 这可能是 stdlib 和 Boost 的约定,但作为一个完整的预感,我真的不确定这是大多数 user 代码的约定,我认为我们都知道我们不应该尝试在用户代码中模仿这些库的风格。不过关于 VC 和“内部课程”的要点。
【解决方案2】:

我喜欢将相关的类保存在同一个文件中。

例如,如果我有一个用于不同类中的 for_each 循环的函子,那么我通常不会将它放在自己的文件中。这似乎过分了 - 并且将代码与使用过多的地方分开。

但是,一般来说,我会尝试将类分开,并尝试为 .hpp 文件提供合理的树结构,将它们组合在一起使用。在这棵树的头部,我喜欢有一个包含整个库的 catch all 头文件。

【讨论】:

    【解决方案3】:

    是的。作为一般规则,每对.h/.cpp 一个类。文件应以类命名。

    【讨论】:

    • 请提供您的答案。
    【解决方案4】:

    这取决于应用程序。对于某些应用程序,如果它们紧密耦合,则将不同的类组合在一组 .h/.cpp 文件中是有意义的。否则,将一个类拆分为头文件和源文件的标准绝对是正确的做法。

    【讨论】:

      【解决方案5】:

      如果这样做有意义,您应该将 C++ 类放在单独的文件中。对于精心设计的课程,它通常会这样做。它便于编码、维护、模块化、重构和重用。

      然后你有 MyClass.h 包含 class MyClass {...} 和 MyClass.cpp 包含所有 MyClass 的方法。

      如果你有很多小班,这有点疯狂,所以考虑几个选项:

      • 以命名空间命名的文件,例如我的命名空间.h、我的命名空间.cpp
      • 嵌套类 - 将类定义包装在另一个类中是否有意义?这样做意味着嵌套类在没有其父类的情况下不太可能有用。

      最好避免一组额外的命名约定,通过使每个文件名与 C++ 命名空间或类名一致,这样就避免了想出新名称或从一种约定转换为另一种的需要。

      Google 风格指南也有意见,更喜欢带有下划线的文件名。见http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#File_Names

      【讨论】:

        【解决方案6】:

        是的,最好将单独的类保存在单独的 cpp 文件中,然后使用类名命名文件。事实上,Java 强迫你这样做。

        【讨论】:

          猜你喜欢
          • 2010-11-03
          • 2011-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多