enable_shared_from_this,关于在类的内部获取该对象shared_ptr指针的问题

今天碰到一个bug,我在QT自定义控件类的内部做了获取该对象的shared_ptr指针,用了this指针,结果发现悲剧了,写了这行代码之后,设置样式表都无效了,就像下面这样:

class MineButton
{
public:
    void on_MineButton_clicked();
}

void on_MineButton_clicked()
{
    ui->MineButton->setStyleSheet("QPushButton{border-image: url(:/background.jpg);}");
    boost::shared_ptr<MineButton> btn = boost::shared_ptr<MineButton>(this);
}

就是这样一行代码,让上面设置样式表的代码失效了,然后发帖求助,碰到大神告诉我,类要继承自boost::enable_shared_from_this,然后这个获取方式是通过shared_from_this()函数获得,遂改之,结果又抛出了一个boost::bad_weak_ptr()的异常,代码如下:

class MineButton:public boost::enable_shared_from_this<MineButton>
{
public:
    void on_MineButton_clicked();
}

void on_MineButton_clicked()
{
    ui->MineButton->setStyleSheet("QPushButton{border-image: url(:/background.jpg);}");
    boost::shared_ptr<MineButton> btn = shared_from_this();
}

然后又百度,在stackoverflow里面看到了相关的解释,凭我拙计英文水平的理解,在调用shared_from_this()函数之前,这个类的对象由一个shared_ptr指针保存,然后我又改了一下代码,在包含了N个MineButton控件的Widget里面:

首先是Widget.h的代码:

class Widget
{
private:
    std::vector<boost::shared_ptr<MineButton>> m_btns;
}

接下来是Widget.cpp的代码:

#InitBtn(i) m_btn[i]=boost::shared_ptr<MineButton>(ui->MineButton_##i)

这个ui->MineButton_0 ... ui->MineButton_N 的对象是QT已经帮我们创建好的,由于控件太多,所以写了一个宏定义,方便调用,至此,上面所述的问题就完全解决了。


下面来总结一下enable_shared_from_this的用法:

1. 包含头文件#include <boost/enable_shared_from_this.hpp>

2. 将这个类继承自enable_shared_from_this,注意后面要跟上模板参数,将你的类名写上,比如我的类是MineButton,就要        这样写:

class MineButton:public enable_shared_from_this<MineButton>
{
...
}

3. 确保这个类的对象被一个shared_ptr的指针保存

最后,以上只是我今天使用这一两个小时总结出来的,如果存在问题,欢迎阅读的各位指正,感谢您的不吝赐教!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值