2016-04-26 75 views
2

我有View類(控制器中的某個地方實例化使用的shared_ptr所屬對象)如何shared_ptr的從內返回當前對象的「本」對象本身

class ViewController { 
protected: 
    std::shared_ptr<View> view_; 
}; 

這種觀點也有方法「的一個實例,則hitTest ()「應該將此視圖的shared_ptr返回到外部世界

class View { 
... 
public: 
std::shared_ptr<UIView> hitTest(cocos2d::Vec2 point, cocos2d::Event * event) { 
... 
}; 

如何從視圖內實現此方法?它應該將此VC的shared_ptr返回到外部? 很顯然,我不能 make_shared(本)

hitTest() { 
... 
    return make_shared<View>(this); 
} 

,因爲這將徹底打破邏輯:它只是將創建從這些原始指針的另一個智能指針(這將是完全無關的所有者的shared_ptr) 所以視圖如何知道其外部的shared_ptr並將其從實例中返回?

+1

共享和唯一指針通常處理所有權。自己擁有一個實例怎麼可能? – ibre5041

+3

我想你可能正在尋找[std :: enable_shared_from_this](http://en.cppreference.com/w/cpp/memory/enable_shared_from_this) –

+3

你見過['std :: enable_shared_from_this'](http:// en.cppreference.com/w/cpp/memory/enable_shared_from_this)? – Angew

回答

3

正如@Mohamad Elghawi正確指出的那樣,您的課程需要從std::enable_shared_from_this派生。

#include <memory> 

struct Shared : public std::enable_shared_from_this<Shared> 
{ 
    std::shared_ptr<Shared> getPtr() 
    { 
     return shared_from_this(); 
    } 
}; 

只是爲了完全回答這個問題,因爲鏈接只有答案是皺眉。

+0

共享類型是如何從模板中繼承的,由Shared類型本身進行模板化?即編譯器應該在定義Shared之前實例化enable_shared_from_this 模板類型,但是它的公開繼承了它自己的子項? – barney

+2

@barney:這就是所謂的CRTP成語:https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern – OnMyLittleDuck

+0

@OnMyLittleDuck哇,這就是東西! – barney