C++方法声明、类定义问题

C++方法声明、类定义问题,c++,declaration,definition,forward-declaration,C++,Declaration,Definition,Forward Declaration,我有两个类: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类和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之前,我已经声明了它?

C++包含规则:尽可能使用前向声明

B只使用指向A的引用或指针。然后使用前向声明:您不需要包含。这将反过来加快一点编译速度

B从A派生,或B显式或隐式地使用类A的对象

资料来源:

为了避免多次包含头文件,您应该包含一个保护,以防止编译器多次读取定义:

#ifndef EMCQUEUE_HH
#define EMCQUEUE_HH
// rest of header file ...
// definition code here...
#endif

参见第二章:组织代码。

编译器在调用A::foo时还没有看到A的定义。不能为不完整的类型调用方法,即编译器尚不知道其定义的类型。在编译器可以看到类A的定义之后,您需要定义调用方法


在实践中,您可能希望将B::Mult1定义定义在单独的CPP文件中,该文件包含包含A类</P>-1的头文件的包含,用于显示无效的C++代码而无需指示。我们怎么知道你的意思是象征性的,你的意思是严肃的?@Johannes Schaub-litb-为什么要否决投票,而用户甚至不知道发布的过程?我今天才成为会员。请他适当地澄清他的问题,如果他不这样做,就投反对票。@DumbCoder,不,我会先投反对票。那么,当他修正它的时候,我将撤销我的否决票,并可能对它进行表决。@Johannes Schaub-litb-那么为什么不告诉他如何至少纠正它呢?如果没有任何指针,他可能会丢失,而其他用户会标记您的否决票,并进一步否决他。@约翰·弗拉:您确定您声称一切正常的代码实际上已经编译好了吗?如果是,您一直在使用什么编译器?

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();
}