一,应用场景
使用mysql数据库时, 当应用数据写入mysql失败后,使用sqlite数据库作临时存储,然后更新到mysql数据库中。
抽象接口如下:
#include <iostream>
#include <memory>
class IDataBase;
class CMysqlDataBase;
class CSqliteDataBase;
typedef std::shared_ptr<IDataBase> SPIDataBase;
typedef std::shared_ptr<CMysqlDataBase> SPMysqlDataBase;
typedef std::shared_ptr<CSqliteDataBase> SPSqliteDataBase;
class IDataBase
{
public:
virtual ~IDataBase(){}//使子类能够调用自己的析构函数
virtual int execSQL(const std::string &sql) = 0;
//......略
};
class CMysqlDataBase
{
public:
virtual ~CMysqlDataBase() {std::cout<<"CMysqlDataBase::~CMysqlDataBase()\n";}
virtual int execSQL(const std::string &sql)
{
std::cout<<"CMysqlDataBase::execSQL: "<< sql.c_str() <<std::endl;
}
//......略
};
class CSqliteDataBase
{
public:
virtual ~CSqliteDataBase() {std::cout<<"CSqliteDataBase::~CSqliteDataBase()\n";}
virtual int execSQL(const std::string &sql)
{
std::cout<<"CSqliteDataBase::execSQL: "<< sql.c_str() <<std::endl;
}
//......略
};
使用数据库对象时,需要根据条件获取到mysql数据库或者sqlite数据库:
class CDataBaseHelp
{
public:
//SPIDataBase tmp = m_spMysqlDataBase;
//SPIDataBase tmp = m_spSqliteDataBase;
SPIDataBase GetSuitableDataBase();
private:
SPMysqlDataBase m_spMysqlDataBase;
SPSqliteDataBase m_spSqliteDataBase;
};
发现可以将子类智能指针直接赋值给父类智能指针,从而完成内存管理操作。