使用二阶构造实现计算器页面的构造过程

二阶构造

一. 构造函数

1.1 构造函数的特点

  1. 类的构造函数用于对象的初始化
  2. 构造函数与类同名并且没有返回值
  3. 构造函数在对象定义时自动被调用
  4. 所以构造函数只能决定的只是对象的初始状态,而不是对象的诞生

1.2 构造的过程

  1. 资源无关的初始化操作:不会出现异常情况的操作

  2. 需要使用系统资源的操作:可能出现异常情况,如:内存申请,访问文件等 请添加图片描述

二. 使用二阶构造实现计算器页面的构造过程

1.1 代码

  1. 类的声明

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <QLineEdit>
    #include <QPushButton>
    
    class CalculatorUI : public QWidget
    {
        //  如果一个类中有用户自定义槽函数,必须在类的起始位置加这个声明
        Q_OBJECT
    
        QLineEdit *le;
        QPushButton* button[20];
        CalculatorUI(QWidget *parent = nullptr);
    
    public:
        void show();
        static CalculatorUI* NewInstance();  //静态成员函数,CalculatorUI类的资源申请,不一定申请成功,所以要能通过类名访问
        bool construct();
        ~CalculatorUI();
    
    private slots:
        void onButtonClicked();
    
    };
    #endif // WIDGET_H
    
    
  2. 类的实现

    #include "Widget.h"
    #include "ui_Widget.h"
    #include <QLineEdit>
    #include <QPushButton>
    
    #include <QDebug>
    
    //构造函数本身不执行任何资源申请的操作了
    CalculatorUI::CalculatorUI(QWidget *parent): QWidget(parent, Qt::WindowCloseButtonHint)
        : QWidget(parent)
    {
    }
    
    //由于构造函数没有返回值无法判断组件构造过程是否顺利,定义一个带bool类型返回值的构造函数,来实现构造的过程
    bool CalculatorUI::construct()
    {
        bool ret = true;
        QString icon[20] = {
            "7", "8", "9", "+", "(",
            "4", "5", "6", "-", ")",
            "1", "2", "3", "*", "<-",
            "0", ".", "=", "/", "C"
        };
    
        le = new QLineEdit(this);
        //每一个组件的构造都要判断,是否申请成功
        if(nullptr != le){
            le->move(10, 10);
            le->resize(240, 30);
            le->setAlignment(Qt::AlignRight);
        }else{
            ret = false;
        }
    
        //    QPushButton* button[20];
        for(int i=0; i<4; i++){
            for(int j=0; j<5; j++){
                button[i*5+j] = new QPushButton(this);
    
                if (nullptr != button[i*5+j]){
                    button[i*5+j]->move(10+j*50, 50+i*50);
                    button[i*5+j]->resize(40, 40);
                    button[i*5+j]->setText(icon[i*5+j]);
                    QObject::connect(button[i*5+j], SIGNAL(clicked()), this, SLOT(onButtonClicked()));
                }else{
                    ret = false;
                }
    
            }
        }
    
        return ret;
    }
    
    
    //CalculatorUI本身也需要判断是否申请内存成功,此函数为静态成员函数,可以通过类名访问
    CalculatorUI* CalculatorUI::NewInstance()
    {
        CalculatorUI* ret = new CalculatorUI();
    
        if((nullptr == ret) || !ret->construct()) {
            delete ret;
            ret = nullptr;
        }
        return ret;
    }
    
    
    void CalculatorUI::show()
    {
        setFixedSize(260, 250);
        QWidget::show();
    }
    
    CalculatorUI::~CalculatorUI()
    {
        //delete[] button;
    }
    
    
    
    void CalculatorUI::onButtonClicked()
    {
        QPushButton *tmp = (QPushButton *)sender(); //sender()作用是获取发送信号的组件
        qDebug() << tmp->text() ;
    
    }
    
    
    
  3. main函数

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        //为cal申请资源
        CalculatorUI* cal = CalculatorUI::NewInstance();
        int ret = -1;
    
        if(nullptr != cal){
            cal->show();
            ret = a.exec();
            delete cal;
        }
    
        return ret;
    }
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值