Dan*_*B91 0 c++ design-patterns shared-ptr c++11
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;
};
Run Code Online (Sandbox Code Playgroud)
我正在编写一个Game Boy模拟器,这个类是Qt GUI将与之交互的.也就是说,对于GUI中绘制的每个帧,它将调用GameBoy :: step().显然,由于我还没有开始在GPU上工作,所以还没有完成.
我目前正在质疑这个设计,因为这3个类(Cartridge,CPU,MMU)只会被实例化一次.单身是一个比这更好的设计,还是这个当前的设计是最好的?
如果这个最好,我应该继续使用shared_ptr吗?我已经读到应该谨慎使用它,但是在这里,它似乎有意义,因为所有3个类都相互依赖.
非常感谢你!
编辑:人们问我为什么要使用指针.从初始列表中可以看出,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);
}
Run Code Online (Sandbox Code Playgroud)
编辑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;
};
Run Code Online (Sandbox Code Playgroud)
要么:
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;
};
Run Code Online (Sandbox Code Playgroud)
我喜欢第一个更好一点,因为它似乎更一致,但GameBoy从不使用MMU.
我目前正在质疑这个设计,因为这3个类(Cartridge,CPU,MMU)只会被实例化一次.
没有用户会想要比如看他们的朋友玩游戏吗?流式传输命令并在主机上模拟它们比流式传输视频更具带宽效率.从来没有人愿意和朋友一起做"链接模式"的事情.从来没有,先生.
也就是说,这是你的应用程序的某种基石,实际上是单身人士的理由,这是完全错误的.您当前的设计和功能并不需要更多,但绝对没有任何理由可以锁定自己.其次,即使它们只能实例化一次,也可以通过某些private
访问控制有效地强制执行不需要全球状态.
简而言之,单身人士是现代编程中最糟糕的想法之一.不要使用它.
如果这个最好,我应该继续使用shared_ptr吗?我已经读到应该谨慎使用它,但是在这里,它似乎有意义,因为所有3个类都相互依赖.
呃没有.为什么要使用指针?只需将它们作为成员变量直接使用.跨类依赖是没有理由使用的shared_ptr
,只需使用T*.