如何使用setUserData(void *)的智能指针?

时间:2016-03-15 09:07:01

标签: c++ c++11 cocos2d-x cocos2d-x-3.0

是否可以使用带有节点用户数据的c ++ 11智能指针?以前有人试过吗?

node->setUserData(void* usrData);
node->getUserData();

解决:

我想出了一种在Node中存储对象的方法,而无需手动删除主题(在Node被销毁时自动删除),它可能不是最佳解决方案,但它仍然是一个解决方案,它涉及继承自 cocos2d :: Ref 类并使用节点 setUserObject(Ref * ptr)!

这就是我实现它的方式:

1) - 创建一个继承自cocos2d :: Ref class。

的类/结构

2) - 用自定义属性和方法填充它。

3) - 确保对象调用autorelease()。

struct Box : public cocos2d::Ref
{
    // some properties here

    Box() {
        //autorelease means let other Nodes retain and release this object.
        //if you don't call autorelease then the object destructor won't get called which means in turn object memory is not released.
        this->autorelease();
    }

    ~Box() {
        //just to check if the object destructor is called or not.
        log("=========================");
        log("Box is destroyed"); 
        log("=========================");
    }

};

4) - 创建一个对象实例并将其指针放在任何Node UserObject中,如下所示:

auto box = new Box;
this->setUserObject(box);// am putting it in the Layer UserObject

现在,只要销毁了Layer / Node(不需要删除),就会自动销毁box对象

PS:您应该正确退出cocos2d-x应用程序,以便调用节点(Node,Layer,Scene)析构函数,以便节点子节点被正确销毁(子节点析构函数被调用)...只需按下背面如果您在模拟器中使用按钮或使用调用Director :: end()的关闭按钮。

1 个答案:

答案 0 :(得分:0)

这是一个评论,但是太长了。

我不认为它像@Joachim Pileborg在评论中所做的那样毫无希望(尽管他的观点在原则上是正确的)。你唯一要假设的是setUserData只是观察,即它不执行与记忆相关的动作,特别是没有delete

然后您可以简单地使用智能指针“外部”,

auto ptr = std::make_unique<some_object>();
node->setUserData(ptr.get());

现在,如果程序以适当的方式退出,至少您不必手动删除ptr。但是,正如Joachim所提到的,当然{}}}必须确保ptr存在,只要它可以在node内使用。

或者,您可以在node类周围编写一个小包装器,其中包含shared_ptr<void> ptr变量,并提供setUserData(shared_ptr<void>)方法。如果调用此方法,它首先复制共享指针并在内部调用node->setUserData(ptr.get())方法。然后保证底层物体保持活力。