(二十一)QT的构造函数重载

在实际开发中,我们可能遇到一个问题:对于一个类,我们可能需要传递给它不同的参数,让它执行不同的行为;或者在使用旧的类时,我们希望加上一个新的参数,但是这个参数在旧的逻辑中不使用,需要在新的逻辑中使用,如果我们改了这个类,会导致使用旧的类的函数同步修改,这是我们不希望的,因为谁都不希望重构旧的代码(。。。)

遇到以上情况,更多时我们会重新写一个方法或者干脆新建一个类,但是如果你需要使用老的类中的函数并且老的函数大量重复,这就会造成代码冗余,遇到这个问题,其实我们可以考虑重载构造函数,使用多个构造函数达到这个目的。声明类传入不同的参数即可达到目的。

如下:
calculate.h文件

#ifndef CALCULATE_H
#define CALCULATE_H

#include <QObject>

class calculate : public QObject
{
    Q_OBJECT
public:
    calculate(QObject *parent = 0);//传入qobject
    calculate(int a, int b, QObject *parent = 0);//传入int和qobject
    calculate(int a);//只传入int
    calculate(int a, double b, QObject *parent = 0);//传入int double和qobject
};

#endif // CALCULATE_H

calculate.cpp文件

#include "calculate.h"
#include <QDebug>

calculate::calculate(QObject *parent) : QObject(parent)
{
    qDebug() << "nothing";
}

calculate::calculate(int a, int b, QObject *parent) : QObject(parent)
{
    qDebug() << "a + b  = " << (a+b);
}

calculate::calculate(int a)
{
    qDebug() << "a = " << (a);
}

calculate::calculate(int a, double b, QObject *parent) : QObject(parent)
{
    qDebug() << "a + double b  = " << (a+b);
}

需要注意的是函数声明,你需要传入你想要的构造函数的参数,参数不能少,也不能多,顺序和类型、数量必须完全一致,否则编译器可能会选择错构造函数,如下:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    m_cal(new calculate(parent))
{
    ui->setupUi(this);
    calculate *m_cal1 = new calculate(1);
    calculate *m_cal2 = new calculate(1,2,NULL);
    calculate *m_cal3 = new calculate(1,2.0,NULL);
}

结果如下:
在这里插入图片描述

理解起来并不难:你可以把构造函数重载看成多胞胎,这几个孩子长得类似,但是一个需要苹果才和你玩,一个需要苹果和桃子才和你玩,一个需要桃子和李子才和你玩,你要找对应的孩子玩,就要拿出他们想要的东西才可以。
你只拿出苹果,省略了桃子,那么你只能叫出“需要苹果”的孩子,编译器这个“家长”肯定不会把“需要苹果和桃子”的孩子分派给你玩。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
QMessageBox 的构造函数有多个重载,以下是其中一个常用的实现代码: ```cpp QMessageBox::QMessageBox(QWidget *parent) : QDialog(parent) { setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setAttribute(Qt::WA_DeleteOnClose); buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, this); buttonBox->setObjectName(QStringLiteral("qt_msgbox_buttonbox")); label = new QLabel(this); label->setObjectName(QStringLiteral("qt_msgbox_label")); label->setWordWrap(true); label->setAlignment(Qt::AlignTop | Qt::AlignLeft | Qt::AlignAbsolute); textEdit = new QTextEdit(this); textEdit->setObjectName(QStringLiteral("qt_msgbox_textedit")); textEdit->setReadOnly(true); textEdit->setHtml(QString::fromLatin1("<html><body><p>%1</p></body></html>").arg(tr("Message"))); iconLabel = new QLabel(this); iconLabel->setObjectName(QStringLiteral("qt_msgbox_iconlabel")); iconLabel->setAlignment(Qt::AlignAbsolute | Qt::AlignTop); iconLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); setTextFormat(Qt::AutoText); setIcon(QMessageBox::NoIcon); setStandardButtons(QMessageBox::NoButton); } ``` 这个构造函数主要是创建了一些界面元素,如 `QDialogButtonBox`、`QLabel` 和 `QTextEdit`,并设置了默认的文本、图标和按钮。在 `setAttribute` 中设置了 `Qt::WA_DeleteOnClose`,表示当对话框被关闭时会自动删除该对象。同时,通过 `setWindowFlags` 函数设置了窗口标志,去掉了上下文帮助按钮。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值