C++ 定义和使用接口类的简单模式
来源:互联网 发布:c语言混淆工具 编辑:程序博客网 时间:2024/06/06 11:26
以一个Person类为接口类,Student类为实现类的代码为例:
1. Person.h声明了Person类,PersonCreator类,并定义了一个全局变量用来创建Student对象
#pragma onceclass Person{public: virtual ~Person() {} virtual void Eat() = 0; virtual void Sleep() = 0;};class PersonCeator{public: ~PersonCeator(); Person* CreateStudent();};extern PersonCeator* g_creator;
2. Student.cpp声明了Student类,并实现了Student类和PersonCreator类:
#include <iostream>#include "Person.h"using namespace std;class Student : Person{public: Student(); virtual ~Student(); virtual void Eat(); virtual void Sleep();};Student::Student(){ cout << "创建Student" << endl;}Student::~Student(){ cout << "析构Student" << endl;}void Student::Eat(){ cout << "吃饭" << endl;}void Student::Sleep(){ cout << "睡觉" << endl;}Person* PersonCeator::CreateStudent(){ Student* student= new Student(); //Student student; return (Person*)student;}PersonCeator::~PersonCeator(){ cout << "析构PersonCreator" << endl;}PersonCeator creator;extern PersonCeator* g_creator = &creator;//这样创建会在main函数运行结束后自动析构//extern PersonCeator* g_creator= new PersonCeator();//这样创建需要手动析构
3. main.cpp使用PersonCreator创建Student对象:
#include <iostream>#include "Person.h"int main(){ Person* Tom = g_creator->CreateStudent(); Tom->Eat(); Tom->Sleep(); delete Tom; //手动析构 //delete g_creator; getchar(); return 0;}
实际上PersonCreator中的create()函数的返回值是Person类的指针,这样能够彻底地隐藏Student类的存在。同时,也应该注意到,一个模块很有可能是以动态库被其他模块调用,所以当对象是在本模块new时,也应当在本模块delete。所以接口类应该提供Release()方法。修改后的代码如下:
1. Person.h声明了IPerson类,IPersonCreator类,并定义了一个全局变量用来创建Student对象
#pragma onceclass IPerson{public: virtual ~IPerson() {} virtual void Release() = 0; virtual void Eat() = 0; virtual void Sleep() = 0;};class IPersonCreator{public: virtual ~IPersonCreator() {} virtual IPerson* CreateStudent() = 0;};extern IPersonCreator* g_pCreator;
2. Student.cpp声明并实现了Student类和PersonCreator类:
#include <iostream>#include "Person.h"using namespace std;////////////////////////////////////////////////////////////////////////////// 声明类Student和PersonCreator////////////////////////////////////////////////////////////////////////////class Student : public IPerson{public: Student(); virtual ~Student(); virtual void Release(); virtual void Eat(); virtual void Sleep();private: char* name;};class PersonCreator : public IPersonCreator{public: PersonCreator(); virtual ~PersonCreator(); virtual IPerson* CreateStudent(); void ReleasePerson(IPerson* pPerson);};PersonCreator creator;IPersonCreator* g_pCreator = &creator;//这样创建会在main函数运行结束后自动析构////////////////////////////////////////////////////////////////////////////// 实现类Student////////////////////////////////////////////////////////////////////////////Student::Student(){ name = new char[255](); cout << "创建Student" << endl;}Student::~Student(){ delete[] name; cout << "析构Student" << endl;}void Student::Release(){ creator.ReleasePerson(this);}void Student::Eat(){ cout << "吃饭" << endl;}void Student::Sleep(){ cout << "睡觉" << endl;}////////////////////////////////////////////////////////////////////////////// 实现类PersonCreator////////////////////////////////////////////////////////////////////////////PersonCreator::PersonCreator(){ cout << "创建PersonCreator" << endl;}PersonCreator::~PersonCreator(){ cout << "析构PersonCreator" << endl;}IPerson* PersonCreator::CreateStudent(){ Student* student = new Student(); return (IPerson*)student;}void PersonCreator::ReleasePerson(IPerson* pPerson){ if (pPerson) { delete pPerson; }}
3. main.cpp使用接口IPersonCreator创建Student对象,使用完之后需要析构Student对象,程序结束后会自动释放PersonCreator对象。
#include <iostream>#include "Person.h"int main(){ IPerson* Tom = g_pCreator->CreateStudent();//使用时不需强制转换了 Tom->Eat(); Tom->Sleep(); Tom->Release(); Tom = nullptr; getchar(); return 0;}
阅读全文
1 0
- C++ 定义和使用接口类的简单模式
- python类的简单定义和使用
- 类和接口的定义
- 策略模式接口和抽象类的简单实现
- C/C++,指针的定义和使用
- 设计模式-简单工厂模式概述和使用-接口
- 接口的定义和简单工厂的举例
- 闭包的简单定义和使用
- java 类里面定义接口的使用
- 定义类和接口
- C#类和接口的定义
- 类_接口的定义和实现
- java接口和抽象类的定义
- 镜头C接口和CS接口的简单区分:
- 镜头C接口和CS接口的简单区分
- Object-c 对象的使用和定义
- <C++>10.对象的定义和使用
- 实验3_Java类的继承和接口的定义和使用
- retrofit+koliten+lambda+glide+recyclerview
- Selenium+python-多窗口、句柄(handle)
- linux相关
- java中求5的阶乘
- 171214之项目错误总结1
- C++ 定义和使用接口类的简单模式
- SpringBoot学习:maven使用spring-boot-devtools和springloaded进行热部署
- 变频器输出侧增加输出滤波器
- android studio 打包jar
- 在微信看优质内容,你还可以关注这 10 个公众号
- centos 6.9启动软件时libstdc++.so.6 报错
- Kaggle HousePrice 特征工程部分之统计检验
- 20171214训练营
- python class和class(object)用法区别-(转)