【发布时间】:2014-10-25 04:16:57
【问题描述】:
问题:如果原始指针仅用作引用,则从 unique_ptr 返回原始指针是否正确?
背景:为了一项挑战,我开始在空闲时间创建一个简单的 2D 游戏引擎。我有一个 Screen 基类和一个 ScreenManager 基类,每个基类都派生自。
屏幕将用于启动画面、选项菜单,当然还有非常重要的游戏屏幕。
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 类更好的方法,还是我做对了?
【问题讨论】:
-
谁拥有谁?将“拥有 Y 类型的 X”表示为
unique_ptr<Y> X。将“对 Y 类型的 X 的非拥有引用”表示为纯Y* x。如果你有两件东西自以为是,那你的日子会很糟糕。 -
如果它是非拥有的,原始指针就可以了。 (或者你可以写一些类似提议的
observer_ptr,世界上最笨的智能指针(TM),以明确非拥有性。) -
virtual void changeScreen(unique_ptr<Screen> newScreen);我很确定这不会编译;它需要复制unique_ptr<Screen>,但不能复制unique_ptr。如果您希望changeScreen声明所有权,请使用unique_ptr<Screen>&& newScreen并离开它。 -
@IgorTandetnik:只要你传递一个 r 值,只按值进行移动不是问题。只有当您尝试将左值传递给它时才会出现错误。
标签: c++ pointers c++11 unique-ptr