C++ 关于头文件C+中的类声明+;

C++ 关于头文件C+中的类声明+;,c++,C++,问题就在这里。我需要用两个类编写头文件,比如说类A和类B 在类A中,我有使用类B对象的函数,反之亦然,即在类B中,我有使用类A对象的函数 如果首先声明了A,则会出现未声明类B的错误。 如何处理?在声明类B之后,我尝试声明类a的函数: void classA::myfunc (classB *b); 但是我得到一个错误,函数myfunc没有声明。 C++中有经验的人,该怎么办? 增加: 下面是一个很好的链接简短的回答: class classA; 然后定义了类B,然后定义了类A的声明 这就是所

问题就在这里。我需要用两个类编写头文件,比如说类A和类B

在类A中,我有使用类B对象的函数,反之亦然,即在类B中,我有使用类A对象的函数

如果首先声明了A,则会出现未声明类B的错误。 如何处理?在声明类B之后,我尝试声明类a的函数:

void classA::myfunc (classB *b);
但是我得到一个错误,函数myfunc没有声明。 C++中有经验的人,该怎么办? 增加: 下面是一个很好的链接

简短的回答:

class classA;
然后定义了类B,然后定义了类A的声明


这就是所谓的前向声明,它可以解决您的问题:)

如果您需要指向标头上类的指针,而不是完整对象,只需添加前向声明,而不包括指针类的标头

我确信你只是使用指针来访问一个引用另一个的类,不是吗?你知道,因为如果你使用实例,你会得到一个实例循环。使用转发声明

下面是一个如何使用转发声明的示例:

A.h

要说明如何让一个类引用一个指向其类型的类,请执行以下操作:

B.h

正如Tony Delroy所提到的(非常感谢他),您不应该总是使用这种设计。它是由C++编译器提供的,但这不是一个好的实践。最好是提供引用头,这样您的代码如下所示:

A.h

您的转发头如下所示:

B.fwd.h:

class B;
在您的FWD中,您应该有您的类转发声明,以及它附带的任何typedef

我没有提到过
#pragma一次
,或者
#ifndef B.H.
你知道他们会在那里:D


您的代码将使用由定义的标准,并且更易于维护,特别是如果它们是模板。

在将类与ref或ptr一起使用之前,您可以尝试添加类的前向声明

类别A.h:

class classB;

class classA {
    void fun(classB * b);
}
B.h类:

class classA;

class classB {
    void fun(classA * a);
}
classA.cpp:

#include "classA.h"
#include "classB.h"

...
classB.cpp:

#include "classA.h"
#include "classB.h"

...

通常,您希望根据需要在公共头中声明公共类。预编译头或公共库头(带有枚举和类等)对此很有效。这不仅适用于指针,也适用于方法参数和返回类型。是的,我知道,但我没有说这只是针对指针,我说如果不需要完整对象,也就是实现。啊,对不起,但是你为什么把我的答案和@boydc one标记为无用?这不是真的,声明,而不是实现:),而且如果您需要知道对象的大小,通常是在声明该类型的实例变量时。前向声明是一种很好的技术!我经常使用它们。不知道为什么有人投票否决了这个答案。1:你的“神圣规则”是不好的做法。如果需要B的转发声明,最佳做法是提供转发声明头,例如B.fwd.h(根据标准库的iosfwd)。这一点很重要,因为1)转发声明应该与其他B文件一起维护,并从中包含,以提供编译时一致性检查;2)代码更改,例如移动到
模板类Basic_B{…};typedef Basic_B不会破坏客户端代码。回答得很好,我认为这就完成了我的工作。您应该在头中进行转发声明,并且头包含在.cpps(:
class classA;

class classB {
    void fun(classA * a);
}
#include "classA.h"
#include "classB.h"

...
#include "classA.h"
#include "classB.h"

...