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;}
原创粉丝点击