Singleton,shared_ptr,原始指针或其他指针?

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.

Pup*_*ppy 8

我目前正在质疑这个设计,因为这3个类(Cartridge,CPU,MMU)只会被实例化一次.

没有用户会想要比如看他们的朋友玩游戏吗?流式传输命令并在主机上模拟它们比流式传输视频更具带宽效率.从来没有人愿意和朋友一起做"链接模式"的事情.从来没有,先生.

也就是说,这是你的应用程序的某种基石,实际上是单身人士的理由,这是完全错误的.您当前的设计和功能并不需要更多,但绝对没有任何理由可以锁定自己.其次,即使它们只能实例化一次,也可以通过某些private访问控制有效地强制执行不需要全球状态.

简而言之,单身人士是现代编程中最糟糕的想法之一.不要使用它.

如果这个最好,我应该继续使用shared_ptr吗?我已经读到应该谨慎使用它,但是在这里,它似乎有意义,因为所有3个类都相互依赖.

呃没有.为什么要使用指针?只需将它们作为成员变量直接使用.跨类依赖是没有理由使用的shared_ptr,只需使用T*.