我经常发现自己处于一种情况,我在C++项目中面临多个编译/链接器错误,因为一些糟糕的设计决策(由其他人做出:))导致不同头文件中C++类之间的循环依赖(也可能发生)在同一个文件中).但幸运的是(?)这种情况经常不足以让我在下次再次发生问题时记住这个问题的解决方案.
因此,为了便于将来回忆,我将发布一个代表性问题和解决方案.更好的解决方案当然是受欢迎的.
A.h
class B;
class A
{
int _val;
B *_b;
public:
A(int val)
:_val(val)
{
}
void SetB(B *b)
{
_b = b;
_b->Print(); // COMPILER ERROR: C2027: use of undefined type 'B'
}
void Print()
{
cout<<"Type:A val="<<_val<<endl;
}
};
Run Code Online (Sandbox Code Playgroud)B.h
#include "A.h"
class B
{
double _val;
A* _a;
public:
B(double val)
:_val(val)
{
}
void SetA(A *a)
{
_a = a;
_a->Print();
}
void Print()
{
cout<<"Type:B val="<<_val<<endl;
}
};
Run Code Online (Sandbox Code Playgroud)main.cpp
#include "B.h" …Run Code Online (Sandbox Code Playgroud)使用库时,无论是我自己的还是外部的,都有很多带有前向声明的类.根据具体情况,同样的课程也包括在内.当我使用某个类时,我需要知道该类使用的某些对象是向前声明的还是#include(d).原因是我想知道我是应该包括两个标题还是只包含一个标题.
现在我知道检查它是相当简单的,只需编译(或遍历所有标题,直到你发现有问题的对象为#include(d)或forward声明).但是对于大型项目,简单的编译需要很长时间,并且进入每个包含文件以检查所涉及的类是否被包含或者向前声明是繁琐的,特别是如果它是几个级别的深度.为了进一步说明问题:
A类是B类是C类,它有一个指向Class Foo的指针
我包括A类,想知道Class Foo是否可以立即使用,或者我是否必须执行以下操作:
#include "ClassA.h"
#include "ClassFoo.h"
Run Code Online (Sandbox Code Playgroud)
那么,有没有一种快速简便的方法来找出这种依赖关系而无需编译或进入依赖的头文件?(我问这个问题的原因之一是因为如果功能尚不存在,我想最终为VS和/或独立程序创建一个加载项)
谢谢!