循环依赖性问题
Circular Dependancy Issue
今年夏天我一直在写一个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"输出此错误(没有include就不会发生):
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
有什么建议吗?我被难住了。
您应该将ppu.h包含在memory.cpp中(在memory.h之后),而不是包含在memory.h内部,因为memory.h只需要前向声明,错误发生在memory.cpp中
正向声明只能用于声明指针和引用,但要真正使用这些引用,您需要完整的类定义。由于用法应该只出现在.cpp文件中,因此前向声明类的头应该包含在其中。唯一不需要标头的情况是,如果只传递指向前向声明类的对象的指针,而没有实际访问指向的对象。
当编译器没有看到完整的声明时,使用前向声明的类型会产生这样的问题。正向声明只是告诉编译器"此类型存在"。
虽然您没有显示完整的代码,但我怀疑您的头文件中有可执行代码。取出它并将所有可执行代码放入.cpp文件中。
如果你想内联东西:
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
...
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 问题在具有依赖性时从其他路径上加载DLL的DLL
- cmake/make(对象)依赖性问题 - 标头更改时而不是重建
- Visual Studio:C++\CLI 包装程序集路径依赖性问题
- VS 2017 C 静态LIB与 /MD项目依赖性问题编辑
- 循环依赖性问题
- C++对象依赖性问题
- 循环依赖性问题
- 继承和返回实例的循环依赖性问题
- Qt单元测试依赖性问题