循环依赖和函数

时间:2013-01-05 04:54:59

标签: c++

我有两个标题,A和B.它们看起来像这样:

// A.h
#include "B.h";

class A {
    // stuff
    AFunction(B* b);
    OtherFunction();
}

// B.h
class A;

BFunction(A* a);

这是我第一次尝试解决循环依赖,所以我不确定我在做什么。我的问题如下:在某些时候,功能调用a->OtherFunction();。我得到一个错误,因为OtherFunction没有向前声明,我也不能转发声明它,显然。情况是对称的(AFunction调用b-> SomeOtherFunction()),所以我无法通过交换包含和转发声明来修复它。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

如果您需要关于A或B的任何内容,而不只是指定其类型的指针,那么您必须将相关代码移动到.cpp文件中,因为您不能将它们包含在循环中办法。解决方案如下:

<强> A.H

class B; // forward declaration

class A {
  B* b;

  // legal, you don't need to know anything about B
  void set(B* b) { this->b = b; } 

  // must be implemented in .cpp because it needs to know B
  void doSomethingWithB(); 
};

<强> A.cpp

#include "A.h"
#include "A.h"

void A::doSomethingWithB() {
  b->whatever();

<强> B.h

class A

class B {
  void methodWithA(A* a);
};

<强> B.cpp

#include "B.h"
#include "A.h"

void B::methodWithA(A* a) {
  a->whatever();
}

答案 1 :(得分:0)

两个.cpp文件都应包含.h文件。

简化示例:

// A.h
void funcA();

// A.c
#include "A.h"
#include "B.h"
void funcA() { funcB(); }

// B.h
void funcB();

// B.c
#include "A.h"
#include "B.h"
void funcB() { funcA(); }

请记住,除非您正在处理模板化类,声明进入头文件定义(实现)进入源文件

答案 2 :(得分:0)

只要您在类定义中仅使用指针,就可以在.h文件中的每个类前面声明另一个类,然后< strong>在.cpp文件中包含.h 文件。

将.h文件中类的定义中的任何代码移动到 .cpp 中函数的定义,以减少任何依赖关系。即使用.cpp文件中的其他类详细信息定义所有函数。

答案 3 :(得分:0)

从成员函数A::OtherFunction()更改为独立函数OtherFunction(A*)