很抱歉,标题不清楚。但是,我将尝试清楚地解释问题。
我正在使用 MVC 用于应用程序体系结构的 c ++ 和 QT :
-有关应用程序结构的一些说明:
模型部分(使用多态模式设计):
负责数据库相关的工作,它具有 IDataBase.h 接口及其对sqlite数据库类型的实现。
IDataBase.h:
namespace model{
class IDataBase;
}
class IDataBase
{
public:
virtual ~IDataBase(){
//;
}
virtual bool connect(const QString &db) = 0;
virtual bool insertData(QMap<QString,QVariant> &queryData, const
QString &table) = 0;
};
sqlitedb.h
class SqliteDB: public IDataBase
{
public:
SqliteDB();
~SqliteDB();
bool connect(const QString &db)
bool insertData(QMap<QString,QVariant> &queryData, const QString &table);
private:
QSqlDatabase m_database;
};
控制器部分:我正在使用模板类 DataBaseService 来管理任何类型的数据库(mysql,sqlite ... )。
DataBaseService.h //模板变量是数据库类型类
template<class T>
class DatabaseService
{
public:
DatabaseService();
~DatabaseService();
bool addProduct(QMap<QString,QVariant> &queryData, const QString &table);
private:
std::unique_ptr<IDataBase> m_database;
};
DataBaseService.cpp
template<class T>
DatabaseService<T>::DatabaseService()
{
m_database = std::make_unique<T>();
m_database->connect("db.sqlite");
}
-问题是:
当我尝试使用 main.cpp 中的模板变量 SqliteDB 创建类 DatabaseService 的指针时文件:
DatabaseService<model::SqliteDB> *sqliteDb = new DatabaseService<model::SqliteDB>();
我收到此未解决的外部错误:
错误:LNK2019:未解决的外部符号“ public:__ cdecl DatabaseService :: DatabaseService(void)“ (?0?$ DatabaseService @ VSqliteDB @ model @@@@@ QEAA @ XZ)在 功能主要
-我的问题:
- 我的设计出什么问题了?
- 有没有更好的方法来设计数据库工作流程?
-编辑:
在阅读 Miles Budnek 提供的链接之后,我了解了模板的实际工作原理,并且知道可以使用三种方法来编写模板类的实现:
直接在头文件中编写实现。
在.cpp文件中写入实现,并在cpp文件中写入显式实例。
因此,我使用了第二种方法,并在 DataBaseService.cpp 的末尾使用了model :: SqliteDB类编写了显式实例化。
template class DatabaseService<model::SqliteDB>;
这解决了无法解决的外部错误! 但是现在在尝试在以下行中为DataBaseService.cpp中的 SQliteDB 对象创建 IDatabase 指针时遇到另一个错误:
m_database = std::make_unique<T>();
错误:
错误:没有可行的重载'='
错误:C2679:二进制'=':找不到右手运算符 类型'std :: unique_ptr>'的操作数(或 没有可接受的转换) T = model :: SqliteDB, _Ty = model :: SqliteDB]