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

时间:2011-12-26 01:18:47

标签: c++

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

在类A中的

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

如果A先声明,则会出现B类尚未声明的错误。 怎么处理呢?我在声明B类之后尝试声明A类的函数:

void classA::myfunc (classB *b);

但是我收到了函数myfunc未声明的错误。 有经验的C ++人,该怎么办?

添加了: 这是一个很好的链接about header

3 个答案:

答案 0 :(得分:10)

如果你需要一个指向标题上的类的指针,而不是完整的对象,只需添加一个前向声明,不要包含指针类的标题。

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

以下是如何使用前向声明的示例:

A.H

class B;
class C;
class D;
class E;

class A {
    B* pointer; //To just have a pointer to another object.
    void doThings(C* object); //if you just want to tell that a pointer of a object is a param
    D* getThings(); //if you wanna tell that a pointer of such class is a return.
    E invalid(); //This will cause an error, because you cant use forward declarations for full objects, only pointers. For this, you have to use #include "E.h".
};

为了说明如何让一个类提到指向其类型的类:

B.h

class A;
class B {
    A* pointer; //That can be done! But if you use a includes instead of the forward declarations, you'll have a include looping, since A includes B, and B includes A.
}

如Tony Delroy所述(非常感谢他)你不应该总是使用这种设计。它由C ++编译器提供,但它不是一个好习惯。最好提供引用标头,因此您的代码如下所示:

A.H

#include "B.fwd.h"
#include "C.fwd.h"
#include "D.fwd.h"
#include "E.fwd.h"

class A {
    B* pointer; //To just have a pointer to another object.
    void doThings(C* object); //if you just want to tell that a pointer of a object is a param
    D* getThings(); //if you wanna tell that a pointer of such class is a return.
    E invalid(); //This will cause an error, because you cant use forward declarations for full objects, only pointers. For this, you have to use #include "E.h".
};

你的转发标头如下:

B.fwd.h:

class B;

在你的fwds中,你应该有你的类前向声明​​,以及它附带的任何typedef。

我没有提到#pragma once#ifndef B.H...你知道他们会在那里:D

您的代码将采用 <iosfwd> 定义的标准,并且最好维护,特别是,如果它们是模板。

答案 1 :(得分:4)

简短回答:

class classA;

然后你定义了你的classB,然后是classA的声明。

这称为前向声明,可以解决您的问题:)

答案 2 :(得分:0)

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

classA.h:

class classB;

class classA {
    void fun(classB * b);
}

classB.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"

...