C++类头文件组织

时间:2023-01-22
本文介绍了C++类头文件组织的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于必须处理分布在多个源文件和头文件中的大量相互依赖的类的人,您建议的 C++ 编码和文件组织指南是什么?

What are the C++ coding and file organization guidelines you suggest for people who have to deal with lots of interdependent classes spread over several source and header files?

我在我的项目中遇到了这种情况,解决跨多个头文件的类定义相关错误已经变得非常令人头疼.

I have this situation in my project and solving class definition related errors crossing over several header files has become quite a headache.

推荐答案

一些通用指南:

  • 将您的接口与实现配对.如果您有 foo.cxx,那么在其中定义的所有内容最好在 foo.h 中声明.
  • 确保每个头文件#include 独立编译所需的所有其他必要的头文件或前向声明.
  • 抵制创建一切"标题的诱惑.他们总是在路上遇到麻烦.
  • 将一组相关(和相互依赖)的功能放入一个文件中.Java 和其他环境鼓励每个文件一个类.对于 C++,您通常希望每个文件有一组 类.这取决于您的代码结构.
  • 尽可能优先使用前向声明而不是 #include.这允许您打破循环头依赖关系.本质上,对于跨单独文件的循环依赖,您需要一个看起来像这样的文件依赖图:
    • A.cxx 需要 A.hB.h
    • B.cxx 需要 A.hB.h
    • A.h 需要 B.h
    • B.h 是独立的(并且前向声明在 A.h 中定义的类)
    • Pair up your interfaces with implementations. If you have foo.cxx, everything defined in there had better be declared in foo.h.
    • Ensure that every header file #includes all other necessary headers or forward-declarations necessary for independent compilation.
    • Resist the temptation to create an "everything" header. They're always trouble down the road.
    • Put a set of related (and interdependent) functionality into a single file. Java and other environments encourage one-class-per-file. With C++, you often want one set of classes per file. It depends on the structure of your code.
    • Prefer forward declaration over #includes whenever possible. This allows you to break the cyclic header dependencies. Essentially, for cyclical dependencies across separate files, you want a file-dependency graph that looks something like this:
      • A.cxx requires A.h and B.h
      • B.cxx requires A.h and B.h
      • A.h requires B.h
      • B.h is independent (and forward-declares classes defined in A.h)

      如果您的代码旨在成为其他开发人员使用的库,则需要采取一些额外的步骤:

      If your code is intended to be a library consumed by other developers, there are some additional steps that are important to take:

      • 如有必要,请使用私有标头"的概念.也就是说,几个源文件需要的头文件,但公共接口从来不需要.这可以是包含常见内联函数、宏或内部常量的文件.
      • 在文件系统级别将公共接口与私有实现分开.我倾向于在我的 C 或 C++ 项目中使用 include/src/ 子目录,其中 include/ 包含我所有的公共头文件,并且 src/ 有我所有的来源.和私人标题.
      • If necessary, use the concept of "private headers". That is, header files that are required by several source files, but never required by the public interface. This could be a file with common inline functions, macros, or internal constants.
      • Separate your public interface from your private implementation at the filesystem level. I tend to use include/ and src/ subdirectories in my C or C++ projects, where include/ has all of my public headers, and src/ has all of my sources. and private headers.

      我建议您找一本 John Lakos 的书大规模 C++ 软件设计.这是一本相当厚重的书,但如果您只是浏览他关于物理建筑的一些讨论,您会学到很多东西.

      I'd recommend finding a copy of John Lakos' book Large-Scale C++ Software Design. It's a pretty hefty book, but if you just skim through some of his discussions on physical architecture, you'll learn a lot.

      这篇关于C++类头文件组织的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

上一篇:为什么 C++ 不让基类实现派生类的继承接口? 下一篇:类声明大括号后的分号

相关文章

最新文章