我解决了循环依赖。解决方案有问题吗?

时间:2020-04-27 11:17:31

标签: c++

我解决了循环依赖。它已经由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;
}

2 个答案:

答案 0 :(得分:3)

解决方案有问题吗?

在标头classA.h中定义B是不必要的,反之亦然。

这不会破坏任何内容,但是当其中一个定义更改时,即使那些翻译单元不依赖于可传递包含的定义,也会导致重新编译包含这些标头之一的翻译单元。

最佳做法是仅包含必须包含的标头。


另一个问题是,在main.cpp中,您依赖B的定义而不直接包含其定义。如果您随时将A的定义更改为不再依赖于B,并因此删除了看似不必要的include,则main.cpp将无法编译,因为它假定{{ 1}}是通过包含classA.h来定义的。

通常最佳做法是直接 包含定义依赖项的头,而不依赖于传递包含。

答案 1 :(得分:2)

这是一种常见的解决方案,除了在每个标头的末尾都包含不必要的包含。删除它们,并在main.cpp中同时包含classA.hclassB.h

相关问题