But we need to consider the side-effect of #include. It may be big deal some time.
for example,
file: module_a.hpp ------------------------------------------ class ModuleA { ... ... };
file: module_a.cpp ------------------------------------------ #include "module_a.hpp" ... ...
file: module_b.hpp ------------------------------------------ #include "module_a.hpp" class ModuleB { ModuleA module_a; ... ... };
file: module_b.cpp ------------------------------------------ #include "module_b.hpp" ... ...
file: main.cpp ------------------------------------------ #include "module_b.hpp" int argc, char *argv[]) { ModuleB module_b; ... ... }
...What's wrong??
C++ programmer always do like this.
Then let me show another approach.
file: module_a.hpp ------------------------------------------ class ModuleA { ... ... };
file: module_a.cpp ------------------------------------------ #include "module_a.hpp" ... ...
file: module_b.hpp ------------------------------------------ #include <memory> class ModuleA; class ModuleB { std::unique_ptr<ModuleA> module_a; ... ... };
file: module_b.cpp ------------------------------------------ #include "module_b.hpp" #include "module_a.hpp" ... ...
file: main.cpp ------------------------------------------ #include "module_b.hpp" int argc, char *argv[]) { ModuleB module_b; ... ... }
The point is the position of '#include "module_a.hpp"'.
Include-dependencies are different.
In the first pattern, the dependency is,
main.cpp --> module_b.hpp --> module_a.hpp module_b.cpp --> module_b.hpp --> module_a.hpp module_a.cpp --> module_a.hpp
The second pattern,
main.cpp --> module_b.hpp module_a.cpp --> module_a.hpp module_b.cpp --> module_b.hpp --> module_a.hpp
If module_a.hpp is modified, the first pattern needs all files to be re-compiiled.
The second pattern needs module_a.cpp, module_b.cpp to be re-compiled.
It looks a small matter in this example, but in big project, it will make a significant difference of buiding time.
Generally, it's not recommended including file in header.
except these cases.
- Headers of library. It will not be modified in future. - Templates. We need to include template to instanciate the actual declaration. - Parent class to inherit.
No comments:
Post a Comment