A class -> A Include B-> 进入B class -> B include A -> A class
(如下代码)
A.h
#ifndef A_H #define A_H #include "B.h" class A { public: A(void); ~A(void); private: B b; }; #endif
B.h
#ifndef B_H #define B_H #include "A.h" class B { public: B(void); ~B(void); private: A *a; }; #endif
问题迎來,编译时编译A头文件,此时发现include B,便跳至B,却又发现B有include A,再次跳回A时,却会因为A先编译时,因为有加入#ifndef A_H与#define A_H的关系,定义过A_H,便不会再往下编译A class,因此而又跳回B,造成B不认识A Class而在编译时出错。
但是,其实我们的B Class只是知道A(pointer)而已,根本不需要include A.h
解決方式一
我们可以通过前至宣告的方式来告诉编译器「先知道这个class的存在,至于他的定义后面会说明」。
只要不涉及生成或操作的话,前至宣告可以用在參考类。
然后再.cpp实际操作时,在include 类头文件:
A.h
#ifndef A_H #define A_H #include "B.h" class A { public: A(void); ~A(void); private: B b; }; #endif
A.cpp
#include "A.h" A::A(void) { } A::~A(void) { }
B类稍微修改一下:
B.h
#ifndef B_H #define B_H class A; class B { public: B(void); ~B(void); private: A *a; }; #endif
在cpp中,我们在来incldue A.h头文件
B.cpp
#include "B.h" #include "A.h" B::B(void) { } B::~B(void) { }
以上的原因与解決方式,希望可以帮助到遇到此问题的人可以解惑!