我有两个类:A和B.类A的某些方法需要使用类B而相反(类B有需要使用类A的方法)。
所以我有:
class A;
class B {
method1(A a) {
}
}
class A {
method1(B b) {
}
void foo() {
}
}
一切正常。
但是当我尝试从B :: method1调用类A的foo()时:
class B {
method1(A a) {
a.foo();
}
}
我得到前向声明和使用不完整类型的编译错误。 但为什么会这样呢? (我在使用之前已经宣布了A级?)
答案 0 :(得分:6)
编译器在您调用A
时没有看到A::foo()
的定义。您不能为不完整类型调用方法 - 即编译器尚不知道其定义的类型。您需要在之后定义调用方法,编译器可以看到class A
的定义。
class A;
class B
{
public:
void method1(A a);
};
class A
{
public:
void method1(B b) { }
void foo() { }
};
void B::method1(A a)
{
a.foo();
}
实际上,您可能希望将B::method1()
的定义放在单独的cpp
文件中,该文件的#include
文件包含class A
。
答案 1 :(得分:2)
C ++ INCLUDE规则:尽可能使用前向声明。
B仅使用A的引用或指针。然后使用前向声明:您不需要包含。这将反过来加快编译速度。
B从A或B派生明显(或隐含地)使用A类对象。然后需要包括
来源:http://www-subatech.in2p3.fr/~photons/subatech/soft/carnac/CPP-INC-1.shtml
为避免多次包含头文件,您应该包含一个保护,以防止编译器多次读取定义:
#ifndef EMCQUEUE_HH
#define EMCQUEUE_HH
// rest of header file ...
// definition code here...
#endif
请参阅Industrial Strength C++第二章:整理代码。