请问您对如何避免头文件的循环依赖有什么好的建议吗?
当然,从一开始,我就尝试将项目设计得尽可能透明。然而,随着越来越多的特性和类被添加,项目变得越来越不透明,循环依赖开始发生。
是否有任何通用的、经过验证的和工作的规则?谢谢。
请问您对如何避免头文件的循环依赖有什么好的建议吗?
当然,从一开始,我就尝试将项目设计得尽可能透明。然而,随着越来越多的特性和类被添加,项目变得越来越不透明,循环依赖开始发生。
是否有任何通用的、经过验证的和工作的规则?谢谢。
如果你有循环依赖,那么你做错了什么。
例如:
foo.h
-----
class foo {
public:
bar b;
};
bar.h
-----
class bar {
public:
foo f;
};
您可能想要的是非法的:
foo.h
-----
class bar; // forward declaration
class foo {
...
bar *b;
...
};
bar.h
-----
class foo; // forward declaration
class bar {
...
foo *f;
...
};
这没关系。
一般规则:
#include "myclass.h"
第一个包含在myclass.cpp
.我遵循的一些避免循环依赖的最佳实践是,
一般的方法是将共性分解到第三个头文件中,然后由两个原始头文件引用。
另请参阅循环依赖最佳实践
取决于您的预处理器功能:
#pragma once
或者
#ifndef MY_HEADER_H
#define MY_HEADER_H
your header file
#endif
如果你觉得设计头文件很无聊,那么你可能会对来自 Hwaci(SQLite 和化石 DVCS 的设计者)的 makeheaders 感兴趣。
一般来说,头文件应尽可能前向声明而不是包含其他头文件。
还要确保每个标题坚持一个类。
那么你几乎肯定不会出错。
最糟糕的耦合通常来自臃肿的模板代码。因为你必须在头文件中包含定义,这通常会导致必须包含各种头文件,然后使用模板的类包含模板头,包括大量其他内容。
出于这个原因,我通常会说:小心使用模板!理想情况下,模板不应该在其实现代码中包含任何内容。
Altough Artyom 提供了最佳答案,本教程也很棒,并提供了一些扩展http://www.cplusplus.com/forum/articles/10627/