C ++类互相使用

时间:2013-05-15 19:40:04

标签: c++ object circular-dependency

我有两个类,比如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()

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

3 个答案:

答案 0 :(得分: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; 
}

答案 1 :(得分:2)

只需向文件A.h添加一个前向声明,因此编译器知道B*是指向稍后定义的类的指针:

class B;

然后定义您的class A并在此之后加入B.h.这样,包括A.h在内的任何人都会定义class Aclass B

在B.h开始时只包括A.h.这样,包括B.h在内的任何人也都会定义class Aclass B

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

此问题称为mutual recursion

答案 2 :(得分: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.cpp中的B.cpp和B.h中包含A.h而不会出现问题。