使用* this作为std :: shared_ptr

时间:2014-07-25 13:19:02

标签: c++ class signals shared-ptr

这是一个“chess ++”问题,我现在正面对我的嵌套类, 虽然它可能看起来像是一个笑话,但它不是一个笑话,而是一个真正的问题,我想解决或改变在我的项目中实现同样的事情的方式。

#include <map>
#include <memory>
#include <iostream>
#include <sigc++/signal.h>

class foo
{
public:
    struct bar;

    typedef sigc::signal<void, std::shared_ptr<bar>> a_signal;

    struct bar
    {
        bar()
        {
            some_signal.connect(sigc::mem_fun(*this, &foo::bar::func));
        }

        void notify()
        {
            some_signal.emit(this); // how to ??
        }

        void func(std::shared_ptr<foo::bar> ptr)
        {
            std::cout << "you haxor!" << std::endl;
            // use the pointer ptr->
        }

        a_signal some_signal;
    };

    std::map<int, std::shared_ptr<bar>> a_map;
};

int main()
{
    std::shared_ptr<foo::bar> a_foo_bar;
    foo foo_instance;

    foo_instance.a_map.insert(std::pair<int, std::shared_ptr<foo::bar>>(4, a_foo_bar));
    foo_instance.a_map.at(0)->notify();
    return 0;
}

我想做的是发出信号。 信号被声明为触发处理程序的信号,该处理程序将shared_ptr作为参数。 函数notify()应该将* this转换为shared_ptr,我该怎么做才能使上面的代码运行?

1 个答案:

答案 0 :(得分:3)

来自enable_shared_from_this

struct bar : std::enable_shared_from_this<bar>

获取会员shared_from_this()

some_signal.emit(shared_from_this());

只要当前对象由至少一个共享指针拥有,这将返回一个共享指针,与该指针共享所有权。请注意,在您的计划中,a_foo_bar为空,因此这个和notify的调用都不起作用。还要注意它不会在构造函数或析构函数中工作,因为此时对象不归共享指针所有。