0

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

我目前拥有的:

  • 三类:cpu、ppu和内存
  • 头文件: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

关于从这里做什么的任何建议?我难住了。

4

3 回答 3

2

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

前向声明只能用于声明指针和引用,但要实际使用这些引用,您需要完整的类定义。由于该用法仅应出现在 .cpp 文件中,因此应将前向声明的类的标头包含在其中。您根本不需要标头的唯一情况是,您只传递指向前向声明类的对象的指针,而没有实际访问指向的对象。

于 2013-08-15T06:13:33.437 回答
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 
  ...
于 2013-08-15T07:38:17.637 回答
0

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

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

于 2013-08-15T06:08:31.970 回答