【问题标题】:use *this as std::shared_ptr使用 *this 作为 std::shared_ptr
【发布时间】:2014-09-17 08:46:48
【问题描述】:

这是我现在在嵌套类中面临的一个“国际象棋++”问题, 虽然它看起来像是一个笑话,但这不是一个笑话,而是我想要解决或改变方式以在我的项目中实现相同目标的真实问题。

#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,我该怎么做才能让上面的代码运行?

【问题讨论】:

标签: c++ class signals shared-ptr


【解决方案1】:

源自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 的调用都不起作用。另请注意,它不能从构造函数或析构函数中工作,因为该对象当时不属于共享指针。

【讨论】:

  • 请注意,如果当前对象shared_ptr所有,shared_from_this()抛出。所以隐藏bar的构造函数可能是个好主意,而是公开一个返回std::shared_ptr&lt;bar&gt;的静态工厂方法,这样你就可以保证所有实例都在shared_ptrs中。
  • @dlf:比这更糟糕的是:如果它不属于共享指针,那么你会得到未定义的行为。 (标准中给出的示例实现,存储一个弱指针,会抛出bad_weak_ptr,但没有要求使用该实现。
猜你喜欢
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
相关资源
最近更新 更多