从unique_ptr返回原始指针是否正确?

时间:2014-08-31 23:47:05

标签: c++ pointers c++11 unique-ptr

问题:如果原始指针仅用作参考,从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类更好的方法,还是我做得对?

2 个答案:

答案 0 :(得分:0)

是的,只要ScreenManager比所包含的Screen更长,那么我认为你做得对。

您可能希望通过引入更稳定的界面(例如Screen)来打破ScreenManagerIScreenManager之间的循环依赖关系,但它很好。

答案 1 :(得分:0)

那是后退指针模式,对吧? A指向B并拥有所有权,而B指向其A而没有所有权。

完全健壮的方法是使用shared_ptr和weak_ptr。如果这是单线程,则可以在父指针声明中记录规则,并注意unique_ptr导致在销毁A时首先销毁B.这样安全,如果你不会滥用指针或稍后更改代码并改变情况。所以,评论和好名字很重要。同意,编译器不能强制执行所有可能的滥用并擦拭你的鼻子。

在真实世界的代码中,您可以指望某人稍后添加某个功能,并且干扰任何“好的,因为它都是正确的”。