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上工作,所以没有完成。单身人士,shared_ptr,原始指针或其他指针?
我目前在质疑这个设计,因为这3个类(Cartridge,CPU,MMU)只会被实例化一次。单身人士是否会比这更好的设计,还是现在的设计最好?
如果这一个是最好的,我应该留在shared_ptr?我已经读过,它应该谨慎使用,但在这里,这似乎是有道理的,因为所有3个类互相依赖。
非常感谢!
编辑:人们问我为什么我使用指针。从init列表中可以看到,MMU需要对Cartridge的引用,CPU需要引用MMU。
Cartridge将被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。
为什么共享指针? –
我应该把它放在我的描述中,但正如您从init列表中看到的那样,MMU需要一个指向Cartridge的指针,并且CPU需要一个指向MMU的指针。有静态分配的对象做这个更好的方法吗? – DanB91
Gameboy班是否全部使用三个? –