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班是否全部使用三個? –