【问题标题】:how to return shared_ptr to current object from inside the "this" object itself如何从“this”对象本身内部将shared_ptr返回给当前对象
【发布时间】:2016-08-20 04:22:12
【问题描述】:

我有一个 View 类的实例(使用 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(this)

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

因为它会完全破坏逻辑:它只会从这个原始指针创建另一个智能指针(这与所有者的 shared_ptr 完全无关) 那么视图如何知道其外部的 shared_ptr 并从实例内部返回呢?

【问题讨论】:

标签: c++ memory-management shared-ptr


【解决方案1】:

正如@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();
     }
 };

只是为了完全回答这个问题,因为只有链接的答案是不受欢迎的。

【讨论】:

  • Shared 类型怎么可能继承自模板,由 Shared 类型本身进行模板化?即编译器应该在定义 Shared 之前实例化 enable_shared_from_this 模板类型,但它公开继承自己的孩子?
  • @OnMyLittleDuck 有趣的是我刚刚做了一个测试。 enable_shared... 类模板 - 应该从 展开到内部某处包含 ivar Shared * 指针的类。因此可以定义:共享类;类 testdrive { 共享 * t; };类共享:公共测试驱动{}; as Shared 仅从 testdrive 继承指向其自身类型的指针 - 并且所有编译都正常
  • 这个答案需要一个关于在不是由某些shared_ptr 管理的对象上使用shared_from_this() 的警告。投票直到修复;-)
猜你喜欢
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
相关资源
最近更新 更多