当我编译以下内容时,我得到了error: unknown type name 'ClassA'; did you mean 'ClassB'?
。
我猜我的编译器需要知道 ClassA 才能知道 ClassB ,但它还需要知道 ClassB 才能知道 ClassA的
所以我尝试了转发声明(如建议的here)。
例如,我在 ClassA.hpp 中的class ClassA;
之前声明了#include "ClassB.hpp"
。它工作得很好!
但是如果我的类使用嵌入式类声明,如下所示,仍然存在错误:
error: incomplete type 'ClassA' named in nested name specifier
class ClassA::ClassC;
^~~~~~~~
在这种情况下,我尝试在ClassC
中声明ClassA
,在ClassA::ClassC
中使用ClassB
并在class ClassA::ClassC;
之前添加#include "ClassB.h"
ClassA.h (其中一些行已注释)。
但它并没有完成这项工作。
我有5个文件:
ClassA 和 ClassB 分别包含class ClassA
和class ClassA
声明。
他们都互相包容。
main.cpp 包括 ClassA.hpp 和 ClassB.hpp 。
ClassA.hpp:
#ifndef CLASSA_HPP
# define CLASSA_HPP
class ClassA;
//class ClassA::ClassC; //<----- This doesn't work.
# include "ClassB.hpp"
class ClassA{
public:
// [...]
void printb(ClassB const & b) const;
//class ClassC{
//};
private:
// [...]
};
#endif
ClassA.cpp:
#include "ClassA.hpp"
void printb(ClassB const & b) const{
// [...]
}
ClassB.hpp:
#ifndef CLASSB_HPP
# define CLASSB_HPP
class ClassB;
# include "ClassA.hpp"
class ClassB{
public:
// [...]
void printa(ClassA const & a) const;
// ClassA::ClassC & returnC(ClassA::ClassC elem);
private:
// [...]
};
#endif
ClassB.cpp:
#include "ClassB.hpp"
void printa(ClassA const & a) const{
// [...]
}
main.cpp:
#include "ClassA.hpp"
#include "ClassB.hpp"
int main(void){
ClassA a = ClassA();
ClassB b = ClassB();
a.printb(b);
b.printa(a);
return 0;
}
在这种情况下,使用前向声明适用于简单类。但它看起来像是一种解决方法,使用嵌入式类变得有点复杂,我真的不知道如何处理它。
所以:
class ClassA::ClassC
?