这是一个“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,我该怎么做才能使上面的代码运行?
答案 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
的调用都不起作用。还要注意它不会在构造函数或析构函数中工作,因为此时对象不归共享指针所有。