2

我有两个类,假设 A 类和 B 类。我的目标是让两个类都使用彼此的功能。问题是,多文件包含结构似乎不允许我这样做。这是我正在尝试做的事情:

#file A.h

Class A{
public:
    int GetInfo();

private:
    B * ptrToB;
};

#file B.h

Class B{
public:
   int getStuff();
private:
   A * ptrToA;
};

我的目标是让 A 类方法能够调用ptrToB->getStuff()并且 B 类方法能够调用ptrToA->getInfo()

这可能吗?怎么会这样?如果不是,为什么不呢?

4

3 回答 3

4

也许使用前向声明?

#file A.h

#ifndef ACLASS_H
#define ACLASS_H

Class B;

Class A{
public:
    int GetInfo();

private:
    B * ptrToB;
};

#endif

然后在 CPP 文件中。

#file A.cpp

#include "B.h"

A::A() : ptrToB(0)
{
  // Somehow get B
}

int A::GetInfo() 
{
  // Return whatever you need in here.
}

对 B 类 H 和 CPP 文件执行相同的操作。

前向定义允许编译器识别类型而无需显式定义。如果您在 A 类中引用了 B,则必须包含 B 的标题。

由于您使用指针来访问 B 编译器不需要知道内部数据,直到您访问它(在 CPP 文件中)。

// Would need the header because we must know 
// the size of B at compile time.
class B;
class A 
{
  B theB; 
}


// Only need forward declaration because a 
// pointers size is always known by the compiler
class B;
class A
{
  B * bPointer; 
}
于 2013-05-15T19:44:43.100 回答
2

只需向文件 Ah 添加前向声明,这样编译器就知道 aB*是指向您稍后将定义的类的指针:

class B;

然后定义你的class A并在此之后包含 Bh。这样,包括 Ah 在内的任何人都将拥有class Aclass B定义两者。

在 Bh 中,只需在开头包含 Ah。这样,包括 Bh 在内的任何人都将同时拥有class Aclass B定义。

当您在关联的 .cpp 文件中定义函数时,您将拥有两个可用的类,并且可以根据需要编写函数。

这个问题称为相互递归

于 2013-05-15T19:42:13.673 回答
2

您可以使用前向声明来打破依赖关系:

#file A.h

Class A{
public:
    int GetInfo();

private:
    B * ptrToB;
};

#file B.h
struct A;
Class B{
public:
   int getStuff();
private:
   A * ptrToA;
};

然后,您可以A.h毫无问题地将 B.cpp 和 Bh 包含在 A.cpp 中。

于 2013-05-15T19:44:44.880 回答