问题:如果原始指针仅用作参考,从unique_ptr返回原始指针是否正确?
背景:对于挑战,我开始在空闲时间创建一个简单的2D游戏引擎。我有一个 Screen 基类和一个 ScreenManager 基类,每个基类都来自于它。
Screen 将用于Splash屏幕,Options Menus,当然还有重要的Game屏幕。
ScreenManager 基类将用于(矢量化,堆叠等)管理器,可根据游戏需求进行规范。
详细信息:目前我的 Screen 类包含一个指向正在管理它的 ScreenManager 的原始指针。就是这样,在当前屏幕中,它可以根据它的状态进行选择,接下来要推送给经理的新屏幕。
剥夺了Sudo代码示例 屏幕类
class ScreenManager; //Forward Declaration class Screen { protected: ScreenManager* m_manager; // Ptr reference to manager public: explicit Screen(ScreenManager *manager) : m_manager(manager){} virtual void handleEvents(const event); // Possibly call m_manager->changeScreen(newScreenUPtr) virtual void update(const time, const window); virtual void render(const time, window); }
ScreenManager类
class ScreenManager { // Implementation specific container of Screens private: virtual void handleEvents(const event); // Call active screens handleEvents() virtual void update(const time, const window); // Same, for update() virtual void render(const time, window); // Same, for render() public: virtual void changeScreen(unique_ptr<Screen> newScreen); }
重新查询:有没有比将ScreenManager指针带入Screen类更好的方法,还是我做得对?
答案 0 :(得分:0)
是的,只要ScreenManager
比所包含的Screen
更长,那么我认为你做得对。
您可能希望通过引入更稳定的界面(例如Screen
)来打破ScreenManager
和IScreenManager
之间的循环依赖关系,但它很好。
答案 1 :(得分:0)
那是后退指针模式,对吧? A指向B并拥有所有权,而B指向其A而没有所有权。
完全健壮的方法是使用shared_ptr和weak_ptr。如果这是单线程,则可以在父指针声明中记录规则,并注意unique_ptr导致在销毁A时首先销毁B.这样安全,如果你不会滥用指针或稍后更改代码并改变情况。所以,评论和好名字很重要。同意,编译器不能强制执行所有可能的滥用并擦拭你的鼻子。
在真实世界的代码中,您可以指望某人稍后添加某个功能,并且干扰任何“好的,因为它都是正确的”。