|
Home >
Real-time Mantra >
Design Patterns > C++ Header File Include Patterns
|
| a.h |
|
| a.cpp |
|
Lets analyze the header file inclusions, from the point of view of classes involved in this example, i.e. ABase, A, B, C and D.
| Class ABase | ABase is the base class, so the class declaration is required to complete the class declaration. The compiler needs to know the size of ABase to determine the total size of A. In this case abase.h should be included explicitly in a.h.
|
| Class B | Class A contains Class B by value , so the class declaration is required to complete the class declaration. The compiler needs to know the size of B to determine the total size of A. In this case b.h should be included explicitly in a.h.
|
| Class C | Class C is included only as a pointer reference. The size or actual content
of C are not important to a.h or a.cpp. Thus only a forward declaration has been
included in a.h. Notice that c.h has not been included in either
a.h or a.cpp. |
| Class D | Class D is just used as a pointer reference in
a.h. Thus a forward
declaration is sufficient. But a.cpp uses class D in substance so it explicitly
includes d.h. |
The key points here are header files should be included only when a forward declaration will not do the job. By not including c.h and d.h other clients of class A never have to worry about c.h and d.h unless they use class C and D in substance.
Also note that a.h has been included as the first header file in a.cpp This will make sure that a.h does not expect a certain header files to be included before a.h. As a.h has been included as the first file, successful compilation of a.cpp will ensure that a.h does not expect any other header file to be included before a.h. If this is followed for all classes, (i.e. x.cpp always includes x.h as the first header) there will be no dependency on header file inclusion.
Note that a.h includes the check on preprocessor definition of symbol _a_h_included_. This makes it tolerant to duplicate inclusions of a.h.
Cyclic dependency exists between class X and Y in the following example. This dependency is handled by using forward declarations.
| x.h and y.h |
|
|
|