2014-08-31 52 views
2

問題:如果原始指針僅用作參考,從unique_ptr返回原始指針是否正確?從unique_ptr返回一個原始指針是否正確?

背景:對於挑戰我開始在空閒時間創建一個簡單的2D遊戲引擎。我有一個Screen基類和一個ScreenManager基類,每個基類都得到了驅動。

屏幕將用於像啓動屏幕,選項菜單,當然也是最重要的遊戲屏幕。

ScreenManager基類將用於(Vectorized,Stacked等)管理器,可以針對遊戲需求進行specilized。

詳細:目前我屏幕類包含一個原始指針屏幕管理在管理它。在當前屏幕中,這是如此,它可以根據它的狀態進行選擇,接下來將新的屏幕推入管理器。

剝離下來須藤代碼示例 Screen類

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); 
} 

重新查詢:難道還有比服用ScreenManage一個更好的辦法r指向Screen類的指針,還是我正確地做對了?

+0

[有點相關](http://stackoverflow.com/questions/17536731/shared-ptr-is-to-weak-ptr-as-unique-ptr-is-to-what-)。 – user657267 2014-08-31 23:52:19

+0

誰擁有誰? Express「擁有Y型的X」作爲'unique_ptr X'。 Express「對Y的X有一個非擁有的引用」,如同'Y * x'。如果你有兩件東西相互擁抱,你會有一段糟糕的時光。 – 2014-09-01 00:00:48

+0

如果它是非擁有的,原始指針是好的。 (或者你可以寫一些類似於提議的['observer_ptr'](http://open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3840.pdf),世界上最笨的智能指針(TM) ,以顯示非擁有權。) – 2014-09-01 00:01:40

回答

0

這是一個回指針模式,對吧? A指向擁有所有權的B,B指向A而沒有所有權。

完全可靠的方法是使用shared_ptr和weak_ptr。如果這是單線程的,那麼可以在父指針聲明中記錄規則,並注意unique_ptr導致B在銷燬A時首先被銷燬。所以這很安全,如果你不會濫用指針或稍後改變代碼並改變情況。所以,評論和好名字很重要。同意,編譯器不能強制執行所有可能的濫用行爲,並且也會抹煞你的鼻子。

在真實世界的代碼中,您可以指望某人稍後添加一個功能,並擾亂任何因「全部正確」而「OK」的事物。

+0

真實代碼已記錄,可能過於透徹。我喜歡共享/弱ptr概念。我對編程概念和術語比較陌生。我會查找「返回指針」並在我的開發分支上進行一些測試。 – BFritz 2014-11-20 17:53:43

0

是的,只要ScreenManager超出了包含的Screen s,那麼我認爲你做得對。

您可能想要通過引入更穩定的接口(例如IScreenManager)來打破ScreenScreenManager之間的循環依賴關係,但它很好。

相關問題