C++ 如何将“共享”ptr从内部返回到当前对象;这";对象本身

C++ 如何将“共享”ptr从内部返回到当前对象;这";对象本身,c++,memory-management,shared-ptr,C++,Memory Management,Shared Ptr,我有一个View类的实例(使用shared_ptr在拥有对象的控制器中的某处实例化) class视图控制器{ 受保护的: std::共享的ptr视图; }; 此视图还具有方法“hitTest()”,该方法应将此视图的共享\u ptr返回给外部世界 class View { ... public: std::shared_ptr<UIView> hitTest(cocos2d::Vec2 point, cocos2d::Event * event) { ... }; 类视图{ ..

我有一个View类的实例(使用shared_ptr在拥有对象的控制器中的某处实例化)

class视图控制器{
受保护的:
std::共享的ptr视图;
};
此视图还具有方法“hitTest()”,该方法应将此视图的共享\u ptr返回给外部世界

class View {
...
public:
std::shared_ptr<UIView> hitTest(cocos2d::Vec2 point, cocos2d::Event * event) {
...
};
类视图{
...
公众:
std::shared_ptr hitTest(cocos2d::Vec2点,cocos2d::Event*事件){
...
};
如何从视图内部实现此方法?它应该将此VC的共享\u ptr返回到外部? 显然,我不能让你分享(这个)

hitTest(){
...
返回make_shared(此);
}
因为它将完全打破逻辑:它只是从这个原始指针创建另一个智能指针(这与所有者的共享\u ptr完全无关)
那么视图如何知道其外部的共享ptr并从实例内部返回它呢?

正如@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();
     }
 };
#包括
struct Shared:public std::从\u中启用\u Shared\u
{
std::shared_ptr getPtr()
{
从_this()返回共享的_;
}
};

完全回答这个问题,因为只链接的答案是不可取的。

共享和唯一指针通常处理所有权。实例怎么可能是自己所有的?我想你可能在寻找你看到了吗?@MohamadElghawi谢谢!@Angew感谢伙计们看起来这就是解决方案共享类型如何可能是继承的从模板中删除,由共享类型本身模板化?也就是说,在定义共享类型之前,编译器应该从该模板类型实例化enable_Shared_,但其公开继承自己的子类?@barney:这被称为CRTP成语:@OnMyLittleDuck有趣的是,我刚刚做了一个测试。enable_Shared…类模板应该正在展开from到一个包含ivar Shared*指针的类。因此可以定义:class Shared;class testdrive{Shared*t;};class Shared:public testdrive{};as Shared仅从testdrive继承指向其自身类型的指针,并且所有编译器都需要一个关于使用来自\u this()的
Shared\u的警告
在不受某些
共享\u ptr
管理的对象上。在修复之前进行向下表决;-)
hitTest() {
...
    return make_shared<View>(this);
}
#include <memory>

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