循环依赖问题

时间:2013-08-15 05:55:23

标签: c++ circular-dependency

今年夏天我一直在写一个NES模拟器,但我遇到了障碍。我正在尝试测试我的ppu代码,但由于循环依赖,我无法编译代码。

我现在有什么:

  • 三个类:cpu,ppu和memory
  • headers:cpu.h,ppu.h和memory.h
  • cpp文件:cpu.cpp,ppu.cpp,memory.cpp和main.cpp

依赖性问题在memory.h中。目前,ppu.h包含memory.h,因此我可以访问VRAM,memory.h包含ppu.h,这样我就可以根据cpu写入内存的内容更新VRAM中的标志或地址。我已经尝试了ppu类的前向声明,因为我只使用了ppu指针,但是失败了。

以下是带有前向声明的示例代码:

case 0x2000:
ppu->ppuTempAddress |= ((data & 0x03) << 10);
break;

错误:

In file included from memory.cpp:1:0:
memory.h:7:7: error: forward declaration of ‘class ppu’
memory.cpp:99:10: error: invalid use of incomplete type ‘class ppu’

include“ppu.h”输出此错误(没有包含时不会发生):

In file included from memory.h:6:0,
                 from memory.cpp:1:
ppu.h:13:20: error: ‘memory’ has not been declared
ppu.h:63:25: error: ‘memory’ has not been declared
ppu.h:66:29: error: ‘memory’ has not been declared

有关于该怎么做的任何建议?我很难过。

3 个答案:

答案 0 :(得分:2)

你应该在memory.cpp中包含ppu.h(在memory.h之后),而不是在memory.h中,因为memory.h只需要前向声明,并且在memory.cpp中发生错误

前向声明只能用于声明指针和引用,但要实际使用这些引用,您需要完整的类定义。由于用法应仅出现在.cpp文件中,因此前面声明的类的标题应包含在那里。唯一不需要标题的情况是,如果只传递指向foward声明类的对象的指针,而不实际访问指向的对象。

答案 1 :(得分:0)

当编译器没有看到完整的声明时,这个问题来自使用前向声明的类型。前向声明只是告诉编译器“这种类型存在”。

虽然您没有显示完整的代码,但我怀疑您的头文件中有可执行代码。取出它并将所有可执行代码放在.cpp文件中。

答案 2 :(得分:0)

如果你想内联:

A.h
  #ifndef A_H
  #define A_H
  class A {};
  #include "A.hcc"
  #endif

A.hcc
  #ifndef A_H
  #error Please include A.h, instead.
  #endif
  #include "B.h"
  // inline functions 
  ...

B.h
  #ifndef B_H
  #define B_H
  class B {};
  #include "B.hcc"
  #endif

B.hcc
  #ifndef B_H
  #error Please include B.h, instead.
  #endif
  #include "A.h"
  // inline functions 
  ...