两个类可以使用C ++看到对方吗?

时间:2009-12-03 01:49:42

标签: c++ class include forward-declaration

所以我有一个A类,我想调用一些B类函数。所以我包括“b.h”。但是,在B类中,我想调用一个A类函数。如果我包含“a.h”,它会以无限循环结束,对吧?我该怎么办呢?

4 个答案:

答案 0 :(得分:36)

只将成员函数声明放在头文件(.h)中,并将成员函数定义放在实现(.cpp)文件中。然后您的头文件不需要包含彼此,并且您可以在任一实现文件中包含两个头文件。

对于需要在成员签名中引用其他类的情况,您可以使用前向声明:

class A;

这使您可以使用指针和引用类型(A*A&),但不能使用A本身。它也不允许你给会员打电话。

示例:

// a.h
struct B; // forward declaration

struct A {
   void foo(B* b); // pointers and references to forward-declared classes are ok
};


// b.h
struct A; // forward declaration

struct B {
   void bar(A& a); // pointers and references to forward-declared classes are ok
};


// a.cpp
#include "a.h"
#include "b.h"

void A::foo(B* b) {
   b->bar(*this); // full declaration of B visible, ok to call members now
}


// b.cpp
#include "a.h"
#include "b.h"

void B::bar(A& a) {
   a.foo(this); // full declaration of A visible, ok to call members now
}

答案 1 :(得分:27)

每个类(A和B)都应该有一个头文件和一个实现文件。

每个头文件(例如A.h)不应包含其他头文件(例如B.h),但可以包含对另一个类的前向引用(例如class B;之类的语句) ,然后可以在其声明中使用指针和/或对其他类的引用(例如class A可能包含B*作为数据成员和/或作为方法参数。)

每个CPP文件(例如A.cpp)可以包括多个头文件(例如A.hB.h)。建议每个CPP文件首先应包含自己的头文件(例如A.cpp应包括A.h然后B.h,而B.cpp应包含B.h然后A.h)。

每个头文件应该只包含声明,而不是类的定义:例如,它将列出类'方法的签名,但不包括方法体/实现(方法体/实现将在.cpp文件,不在头文件中)。因为头文件不包含实现细节,所以它们不依赖于(不需要查看)其他类的细节;至多他们需要知道,例如,B是类的名称:它可以从前向声明中获取,而不是在另一个头文件中包含头文件。

答案 2 :(得分:9)

您还可以使用forward declarations来解决此问题。

答案 3 :(得分:-7)

尝试在您的.h文件周围放置#ifndef#define#endif