c++ - 我解决了循环依赖。解决方案有问题吗?
问题描述
我解决了循环依赖。它已由 g++ 编译。网站上已经存在的解决方案不包含include
在标题中,只需添加class ...;
. 所以,我想知道,解决方案有什么问题吗?
类A.h
#ifndef CLASS_A_H
#define CLASS_A_H
class ClassB;
class ClassA {
public:
ClassB* b;
int get5();
};
#include "classB.h"
#endif
B类.h
#ifndef CLASS_B_H
#define CLASS_B_H
class ClassA;
class ClassB {
public:
ClassA* a;
int get7();
};
#include "classA.h"
#endif
类A.cpp
#include "classA.h"
int ClassA::get5() {
return 5;
}
B类.cpp
#include "classB.h"
int ClassB::get7() {
return 7;
}
主文件
#include <iostream>
#include "classA.h"
int main() {
ClassA a;
std::cout << a.get5() << std::endl;
ClassB b;
std::cout << b.get7() << std::endl;
return 0;
}
解决方案
解决方案有什么问题吗?
在头文件 classA.h 中定义B
是不必要的,反之亦然。
这不会破坏任何内容,但会导致包含其中一个标头的翻译单元在任何一个定义发生更改时重新编译,即使这些翻译单元不依赖于传递包含的定义。
最佳做法是仅包含必须包含的标头。
另一个问题是在 main.cpp 中,您依赖于定义B
而不直接包含其定义。如果您在某个时候将定义更改为A
不再B
以任何方式依赖,并因此删除明显不必要的包含,那么 main.cpp 将无法编译,因为它假定这B
是通过包含 classA.h 定义的。
通常最好的做法是直接包含定义依赖关系的标头而不依赖传递包含。
推荐阅读
- r - 数据框融化问题和气泡图
- reactjs - 实施用户操作与动态操作
- c++ - 无法初始化枚举类类型 | 视觉 C++
- wmi - 我正在寻找返回一个或另一个值的 WQL (WMI SQL) 查询
- android - Android - 蓝牙 API createRfcommSocket 与 createRfcommSocketToServiceRecord
- sql - SQL 错误 [42704]: 错误: 大对象 xxxxxxx 不存在
- android - 如何使用拦截器更改@Query 参数?
- kotlin - Kotlin - SQLiteDatabase - 不确定如何让列文本显示在 ViewHolder 中
- python - Python-docx用连续编号替换字符串
- excel - 如何修改 Google 应用脚本以从 2 列而不是 1 列搜索并在两列匹配时返回整行?