1

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

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

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

// B.h
class A;

BFunction(A* a);

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

我该如何解决这个问题?

4

4 回答 4

1

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

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();

溴化氢

class A

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

B.cpp

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

void B::methodWithA(A* a) {
  a->whatever();
}
于 2013-01-05T05:01:42.183 回答
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(); }

请记住,除非您正在处理模板化类,否则声明放在头文件中,定义(实现)放在源文件中。

于 2013-01-05T04:57:55.773 回答
0

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

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

于 2013-01-05T04:58:59.047 回答
0

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

于 2013-01-05T06:10:28.193 回答