class GameBoy{
public:
GameBoy()
:cart(new Cartridge()),
mmu(new MMU(cart)),
cpu(new CPU(mmu))
{}
void step(); //steps through one instruction
const CPU::State &getCPUState() const noexcept;
void loadROM(std::string fileName);
private:
std::shared_ptr<Cartridge> cart;
std::shared_ptr<MMU> mmu;
std::shared_ptr<CPU> cpu;
};
我正在编写一个 Game Boy 模拟器,而这个类是 Qt GUI 将与之交互的。也就是说,对于在 GUI 中绘制的每一帧,它将调用 GameBoy::step()。显然,它还没有完成,因为我还没有开始在 GPU 上工作。
我目前正在质疑这种设计,因为这 3 个类(Cartridge、CPU、MMU)只会被实例化一次。单例会比这更好,还是当前的设计是最好的?
如果这个最好,我应该留在 shared_ptr 吗?我读过它应该谨慎使用,但在这里,这似乎是有道理的,因为所有 3 个类都相互依赖。
非常感谢!
编辑:人们问我为什么要使用指针。从初始化列表中可以看出,MMU 需要对 Cartridge 的引用,而 CPU 需要对 MMU 的引用。
该墨盒将被 GameBoy::loadROM() 和大多数 MMU 方法使用。我同意 MMU 可能不需要归 GameBoy 所有,但它将在 CPU 和 GPU 之间共享(我认为)。
在下面的示例中,是否有更好的替代购物车共享指针的方法?
类之间的示例用法:
byte MMU::readByte(word address) {
....
value = cart->readROM(address);
....
}
void GameBoy::loadROM(std::string fileName){
cart->loadROM(fileName);
}
编辑2:谢谢大家!我有最后一个问题。如果GPU和CPU都使用MMU,而GameBoy同时使用GPU和CPU,哪种设计更好:
class GameBoy{
public:
GameBoy()
: CPU(&mmu), gpu(&mmu)
...
private:
MMU mmu; //never used by GameBoy
CPU cpu; //CPU and GPU used in GameBoy
GPU gpu;
};
class CPU{
...
private:
MMU *mmu;
};
class GPU{
...
private:
MMU *mmu;
};
或者:
class GameBoy{
public:
GameBoy()
: CPU(), gpu(&cpu.getMMU())
...
private:
CPU cpu; //CPU and GPU used in GameBoy
GPU gpu;
};
class CPU{
...
private:
MMU mmu; //arbitrarily chosen owner. GPU could have been the owner
};
class GPU{
...
private:
MMU *mmu;
};
我更喜欢第一个,因为它看起来更一致,但 GameBoy 从不使用 MMU。