我有这样的情况
A.H
#ifndef _CLASSA
#define _CLASSA
class B;
class A {
virtual void addTo(B*) {}
};
#endif
B.h
#ifndef _CLASSB
#define _CLASSB
#include "A.h"
class B : public A {
B();
void addTo(B* b) {
// blah blah blah
}
};
#endif
B.cpp
#include "B.h"
B::B() : A() {}
的main.cpp
#include "B.h"
int main() {
A* b = new B();
B* d = new B();
b->addTo(d);
}
项目无法编译。如果我在A头中转发声明B,编译器会抱怨B.h中的类的期望。如果我在A.h中包含B.h标头,则编译器无法解析基类。这可能吗?
答案 0 :(得分:2)
是的,在A.h
中添加B.h
并在B
中转发声明A.h
。
如果我在A标题中转发声明B,编译器会抱怨B.h中某个类的期望
现在你拥有代码的方式应该可行。但我怀疑你实际上在方法B
中使用addTo
,在这种情况下,前向声明是不够的。您需要将实现与实现文件分开,并在那里包含B
。
编辑:正如DeadMg所指出的,class B : class A {
是无效的语法,您可能需要class B : A
或class B : public A
。