【发布时间】:2017-07-10 13:46:55
【问题描述】:
我经常发现自己在一个 C++ 项目中面临多个编译/链接器错误,这是由于一些糟糕的设计决策(由其他人做出的 :))导致不同头文件中 C++ 类之间的循环依赖关系 (也可以发生在同一个文件中)。但幸运的是(?)这种情况并不经常发生,以至于我在下次再次发生时记住这个问题的解决方案。
因此,为了方便以后回忆,我将发布一个有代表性的问题和解决方案。当然欢迎更好的解决方案。
-
A.hclass 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; } };
-
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; } };
-
main.cpp#include "B.h" #include <iostream> int main(int argc, char* argv[]) { A a(10); B b(3.14); a.Print(); a.SetB(&b); b.Print(); b.SetA(&a); return 0; }
【问题讨论】:
-
使用 Visual Studio 时,/showIncludes 标志对调试此类问题有很大帮助。
-
Visual Studio 代码有类似的东西吗?
标签: c++ compiler-errors circular-dependency c++-faq