问题:如果原始指针仅用作引用,则从unique_ptr返回原始指针正确吗?
背景:为了迎接挑战,我开始在空闲时间创建一个简单的2D游戏引擎。我有一个屏幕基类和一个ScreenManager基类,每个基类都是从屏幕基类中删除的。
屏幕将用于像飞溅屏幕,选项菜单,当然也是重要的游戏屏幕。
ScreenManager基类将用于(向量化、堆叠等)能够为奥运会的需要出谋划策的经理们。
Details:当前,我的屏幕类持有一个指向正在管理它的ScreenManager的原始指针。是这样的,在当前屏幕中,它可以根据自己的状态选择下一步要推送到管理器上的新屏幕。
剥离Sudo代码示例屏幕类
类ScreenManager;//转发声明类屏幕{受保护: ScreenManager* m_manager;// Ptr引用管理器公共:显式屏幕(ScreenManager*管理器):m_manager(管理器){}虚拟空handleEvents(const事件);//可能调用m_ manager ->changeScreen(newScreenUPtr)虚拟空更新( const time,const窗口);虚拟空呈现(const时间,窗口);}
ScreenManager类
类ScreenManager { //实现特定于屏幕的容器私有:虚拟无效handleEvents(const事件);//调用活动屏幕handleEvents()虚拟空更新( const time,const窗口);//相同,用于update()虚拟空呈现(const time,窗口);//同,用于呈现(公共):虚拟空虚changeScreen(unique_ptr newScreen);}
Requery:有比将ScreenManager指针引入屏幕类更好的方法吗?或者我做得对吗?
发布于 2014-11-18 00:27:49
这是一个背向指针模式,对吗?A指向有所有权的B,B指向没有所有权的A。
完全健壮的方法是使用shared_ptr和weak_ptr。如果这是单线程的,您可以在父指针声明中记录规则,并注意,当A被销毁时,unique_ptr会首先导致B被销毁。所以这是安全的,,如果您不误用指针或稍后更改代码并改变情况的话。所以,评论和好名字是很重要的。同意,编译器不能强制执行所有可能的误用和擦除您的鼻子。
在现实世界的代码中,你可以指望某人稍后会添加一个特性,并对任何“好的,因为它都是正确的”的东西感到不安。
发布于 2014-11-18 00:12:02
是的,只要ScreenManager超过了包含的Screen,那么我认为您做的是对的。
您可能希望通过引入一个更稳定的接口(例如Screen )来打破您在ScreenManager和IScreenManager之间的循环依赖关系,但它还是可以的。
https://stackoverflow.com/questions/25597296
复制相似问题