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

问题描述

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

标签: c++

解决方案


解决方案有什么问题吗?

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

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

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


另一个问题是在 main.cpp 中,您依赖于定义B而不直接包含其定义。如果您在某个时候将定义更改为A不再B以任何方式依赖,并因此删除明显不必要的包含,那么 main.cpp 将无法编译,因为它假定这B是通过包含 classA.h 定义的。

通常最好的做法是直接包含定义依赖关系的标头而不依赖传递包含。


推荐阅读