我解决了循环依赖。它已经由g ++编译。该网站上现有的解决方案在标题中不包含include
,而仅添加class ...;
。所以,我想知道,解决方案是否存在任何问题?
classA.h
#ifndef CLASS_A_H
#define CLASS_A_H
class ClassB;
class ClassA {
public:
ClassB* b;
int get5();
};
#include "classB.h"
#endif
classB.h
#ifndef CLASS_B_H
#define CLASS_B_H
class ClassA;
class ClassB {
public:
ClassA* a;
int get7();
};
#include "classA.h"
#endif
classA.cpp
#include "classA.h"
int ClassA::get5() {
return 5;
}
classB.cpp
#include "classB.h"
int ClassB::get7() {
return 7;
}
main.cpp
#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;
}
答案 0 :(得分:3)
解决方案有问题吗?
在标头classA.h中定义B
是不必要的,反之亦然。
这不会破坏任何内容,但是当其中一个定义更改时,即使那些翻译单元不依赖于可传递包含的定义,也会导致重新编译包含这些标头之一的翻译单元。
最佳做法是仅包含必须包含的标头。
另一个问题是,在main.cpp中,您依赖B
的定义而不直接包含其定义。如果您随时将A
的定义更改为不再依赖于B
,并因此删除了看似不必要的include,则main.cpp将无法编译,因为它假定{{ 1}}是通过包含classA.h来定义的。
通常最佳做法是直接 包含定义依赖项的头,而不依赖于传递包含。
答案 1 :(得分:2)
这是一种常见的解决方案,除了在每个标头的末尾都包含不必要的包含。删除它们,并在main.cpp
中同时包含classA.h
和classB.h
。