C++ 定义和使用接口类的简单模式

以一个Person类为接口类,Student类为实现类的代码为例:1. Person.h声明了Person类,PersonCreator类,并定义了一个全局变量用来创建Student对象

#pragma once

class 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 once

class 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;
}


--------------------- 
作者:文如王勃三生慧 
来源:CSDN 
原文:https://blog.csdn.net/hf19931101/article/details/78802058 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值