2016-04-26 4 views
2

Ich habe eine Instanz von View-Klasse (instanziiert irgendwo im Controller besitzt Objekt mit shared_ptr)wie shared_ptr zum aktuellen Objekt zurück aus dem Innern der „dieser“ Objekt selbst

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

Diese Ansicht hat auch Verfahren „hitTest()“das sollte Bringe diese shared_ptr Sicht nach außen

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

Wie kann ich diese Methode implementieren, aus dem Inneren des view? Es sollte die shared_ptr dieses VC nach draußen zurückgeben? So wäre es nur ein weiteres Smart-Pointer aus dem dieser Rohzeiger erstellen (das wäre völlig unabhängig sein Besitzer shared_ptr) : Natürlich, ich nicht make_shared (diese)

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

, weil sie brechen würde vollständig die Logik Wie kann die Ansicht die shared_ptr von extern erkennen und sie aus der Instanz zurückgeben?

+1

Gemeinsame und einzigartige Zeiger befassen sich in der Regel mit Eigentum. Wie kann eine Instanz für sich selbst sein? – ibre5041

+3

Ich glaube, Sie suchen nach [std :: enable_shared_from_this] (http://en.cppreference.com/w/cpp/memory/enable_shared_from_this) –

+3

Haben Sie ['std :: enable_shared_from_this'] gesehen (http: // en.cppreference.com/w/cpp/memory/enable_shared_from_this)? – Angew

Antwort

3

Wie @Mohamad Elghawi richtig angemerkt hat, muss Ihre Klasse von std::enable_shared_from_this abgeleitet werden.

#include <memory> 

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

Nur um diese Fragen vollständig zu beantworten, da Link-Only-Antworten verpönt sind.

+0

Wie ist es möglich, dass Shared Typ von der Vorlage geerbt wird, durch den Shared Typ selbst templatisiert? d. h. der Compiler sollte den Template-Typ enable_shared_from_this instanziieren, bevor Shared definiert ist, aber öffentlich sein eigenes Kind erbt? – barney

+2

@ Barney: Es heißt das CRTP-Idiom: https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern – OnMyLittleDuck

+0

@OnMyLittleDuck wow, das ist etwas! – barney