Qt-Src-PrivateHide

17 篇文章 0 订阅

Qt的源码结构甚是神奇,一堆宏,充分体现高效的设计,将面向对象进行到底。关于封装,本次了解到一个类的稀有成员如何隐藏。先看下普通的一个类,

class CusData:public QObject{
    Q_OBJECT
public:
    CusData(QObject *parent = nullptr);
    ~CusData();
    void setData(int c, QString s);

// 私有暴露
private:    
    int count;
    QString str;
};

这样仅仅是够用,简单的设计满足的,但是好用,好修改尚未清楚。好在Qt为我们提供了解决方案,如何隐藏私有,涉及的宏如下
// 为该类声明私有成员                   // 获取该类的私有成员指针 
Q_DECLARE_PRIVATE                       Q_D
// 为该类声明共有成员                   // 获取该类的共有成员指针
Q_DECLARE_PUBLIC                        Q_Q
下面对该类进行改造,将其私有成员进行封装,并声明class ##Private{};在构造阶段构造私有指针,使用时通过宏Q_D即可获取d_ptr。
// Qt 私有数据封装 class ##Private, ##连字符
class CusDataPrivate;
class CusData:public QObject{
    Q_OBJECT
public:
    CusData(QObject *parent = nullptr);
    ~CusData();

    void setData(int c, QString s);
    void useTest();
protected:
    // 私有成员接口通过指针使用
    CusDataPrivate *const d_ptr = nullptr;

private:
    Q_DECLARE_PRIVATE(CusData);
};

CusData::CusData(QObject *parent)
    :QObject(parent),d_ptr(new CusDataPrivate(12, "as", this,parent)){}

CusData::~CusData(){}

void CusData::setData(int c, QString s)
{
    // 获取私有成员指针,等效获取d_ptr
    Q_D(CusData);
    d->setCount(20);
    d->setStr("qw");
}

void CusData::useTest()
{
    qDebug() << "pri use main";
}

私有成员类,在public下声明公开类,通过外部传入上层公开类初始化,使用时通过宏Q_Q即可获取q_ptr。

class CusData;
class CusDataPrivate:public QObject
{
    Q_OBJECT
public:
    CusDataPrivate(int c, QString s, CusData *ptr,QObject *parnt = nullptr);
    ~CusDataPrivate();

    int count() const;
    QString str() const;
    void useParentPtr();

public slots:
    void setCount(int count);
    void setStr(QString str);

private:
    int m_count;
    QString m_str;

public:
    // 其上层声明
    Q_DECLARE_PUBLIC(CusData)
    CusData *q_ptr;
};

CusDataPrivate::CusDataPrivate(int c, QString s, CusData *ptr,QObject *parnt)
    :QObject(parnt),m_count(c),m_str(s),q_ptr(ptr){}

CusDataPrivate::~CusDataPrivate(){}

int CusDataPrivate::count() const{
    return m_count;
}

QString CusDataPrivate::str() const{
    return m_str;
}

void CusDataPrivate::useParentPtr(){
    // 获取上层共有成员指针
    Q_Q(CusData);
    q->useTest();
}

void CusDataPrivate::setCount(int count){
    m_count = count;
}

void CusDataPrivate::setStr(QString str){
    m_str = str;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值