这是问题所在。我需要用两个类编写头文件,比如A类和B类。
在类A中的我有使用类B的对象的函数,反之亦然,即在类B中我有使用类A对象的函数。
如果A先声明,则会出现B类尚未声明的错误。 怎么处理呢?我在声明B类之后尝试声明A类的函数:
void classA::myfunc (classB *b);
但是我收到了函数myfunc未声明的错误。 有经验的C ++人,该怎么办?
添加了: 这是一个很好的链接about header
答案 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"
...