Qt C++ visitor模式

这篇博客展示了如何在Qt C++环境中使用访问者模式。通过CEmployee、CManagerElement和CCommandElement类实现员工类,以及CVisitor、CManagerVisitor和CCommanderVisitor类实现访问者接口。代码中,不同类型的员工接受不同类型的访问者,计算不同性别的薪资,演示了访问者模式的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

element.h

#pragma once


#include <QObject>
#include "visitor.h"


class CEmployeePrivate;
class CEmployee : public QObject
{
Q_OBJECT
Q_CLASSINFO("Author","wdj")
Q_ENUMS(ESex)
Q_ENUMS(EGalatyType)
Q_PROPERTY(QString name READ getName WRITE setName)
Q_PROPERTY(ESex sex READ getSex WRITE setSex)
Q_PROPERTY(EGalatyType salary READ getSalary WRITE setSalary)
public:
CEmployee();
~CEmployee();

enum ESex
{
eMan = 0,
eWoman,
};


enum EGalatyType
{
eHigh = 0,
eMid,
eLow,
};

QString getName();
void setName(const QString &name);


ESex getSex();
void setSex(ESex sex);


EGalatyType getSalary();
void setSalary(EGalatyType galary);

virtual QString acceptSalary(CVisitor *visitor) = 0;
private:
CEmployeePrivate *d_ptr;
Q_DECLARE_PRIVATE(CEmployee)
};


class CManagerElement : public CEmployee
{
public:
CManagerElement(){};
QString acceptSalary(CVisitor *visitor)
{
qDebug() << "this is a manager";
return visitor->visitSalary(this);
}


};


class CCommandElement : public CEmployee
{
public:
CCommandElement(){};
QString acceptSalary(CVisitor *visitor)
{
qDebug() << "this is a commader";
return visitor->visitSalary(this);
}
};

element.cpp

#include "element.h"


class CEmployeePrivate
{
Q_DECLARE_PUBLIC(CEmployee)
CEmployee *q_ptr;


public:
CEmployeePrivate(){};
QString m_name;
CEmployee::ESex m_sex;
CEmployee::EGalatyType m_salary; 
};


CEmployee::CEmployee()
{
d_ptr = new CEmployeePrivate();
d_ptr->q_ptr = this;
}


CEmployee::~CEmployee()
{
delete d_ptr;
}


QString CEmployee::getName()
{
return d_ptr->m_name;
}


void CEmployee::setName(const QString &name)
{
d_ptr->m_name = name;
}


CEmployee::ESex CEmployee::getSex()
{
return d_ptr->m_sex;
}


void CEmployee::setSex(ESex sex)
{
d_ptr->m_sex = sex;
}


CEmployee::EGalatyType CEmployee::getSalary()
{
return d_ptr->m_salary;
}


void CEmployee::setSalary(EGalatyType galary)
{
d_ptr->m_salary = galary;
}


#include "moc_element.cpp"

visitor.h

#pragma once


#include <QDebug>
#include <QVariant>


class CEmployee;


class CVisitor
{
public:
~CVisitor(){}
virtual QString visitSalary(CEmployee *elm) = 0;


protected:
CVisitor(){}
};


class CManagerVisitor : public CVisitor
{
public:
CManagerVisitor(){};
~CManagerVisitor(){};


QString visitSalary(CEmployee *elm);
};


class CCommanderVisitor : public CVisitor
{
public:
CCommanderVisitor(){};
~CCommanderVisitor(){};


QString visitSalary(CEmployee *elm);
};

visitor.cpp



#include "visitor.h"
#include "element.h"


QString CManagerVisitor::visitSalary(CEmployee *elm)
{
if (elm->property("sex").toInt() == CEmployee::eMan)
{
return "6000";
}
return "4800";
}


QString CCommanderVisitor::visitSalary(CEmployee *elm)
{
if (elm->property("sex").toInt() == CEmployee::eMan)
{
return "12000";
}
return "8500";
}

main,cpp

#include <QApplication>
#include "element.h"


int main(int argc,char **argv)
{
QApplication app(argc,argv);


CEmployee *manager = new CManagerElement;
CEmployee *commder = new CCommandElement;
manager->setProperty("sex",CEmployee::eMan);
commder->setProperty("sex",CEmployee::eWoman);


CVisitor *mv = new CManagerVisitor;
CVisitor *cv = new CCommanderVisitor;


QString msalary = manager->acceptSalary(mv);
QString csalary = commder->acceptSalary(cv);

delete manager;
delete commder;
delete mv;
delete cv;


return app.exec();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值