首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环依赖问题

循环依赖问题
EN

Stack Overflow用户
提问于 2013-08-15 05:55:23
回答 3查看 117关注 0票数 0

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

我现在拥有的是:

  • 三类: cpu、ppu和内存。
  • 标题: cpu.h、ppu.h和memory.h y.h
  • cpp文件: cpu.cpp、ppu.cpp、memory.cpp和main.cpp

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

下面是一个带有前向声明的代码示例所发生的情况:

代码语言:javascript
复制
case 0x2000:
ppu->ppuTempAddress |= ((data & 0x03) << 10);
break;

而错误是:

代码语言:javascript
复制
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’

包含"ppu.h“输出此错误(如果没有包含,则不会发生此错误):

代码语言:javascript
复制
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

有什么建议吗?我很困惑。

EN

回答 3

Stack Overflow用户

发布于 2013-08-15 06:13:33

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

前向声明只能用于声明指针和引用,但要实际使用这些引用,则需要完整的类定义。由于使用应该只发生在.cpp文件中,所以应该包含前向声明类的头。您根本不需要报头的唯一情况是,只传递指向foward声明类的对象的指针,而不实际访问指向指向的对象。

票数 2
EN

Stack Overflow用户

发布于 2013-08-15 06:08:31

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-08-15 07:38:17

如果你想把事情串联起来:

代码语言:javascript
复制
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 
  ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18247078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档