指向派生类对象的基类指针,派生类对象是另一个类中的模板变量

时间:2018-11-21 00:54:27

标签: c++ polymorphism template-classes

很抱歉,标题不清楚。但是,我将尝试清楚地解释问题。


我正在使用 MVC 用于应用程序体系结构的 c ++ QT

enter image description here

-有关应用程序结构的一些说明:

  • 模型部分(使用多态模式设计):

    负责数据库相关的工作,它具有 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)在   功能主要

-我的问题:

  
      
  1. 我的设计出什么问题了?
  2.   
  3. 有没有更好的方法来设计数据库工作流程?
  4.   

-编辑:
                                                              在阅读 Miles Budnek 提供的链接之后,我了解了模板的实际工作原理,并且知道可以使用三种方法来编写模板类的实现:

  1. 直接在头文件中编写实现。

  2. 在.cpp文件中写入实现,并在cpp文件中写入显式实例。

  3. 在.tpp文件中编写实现,并将其包含在头文件的末尾。

因此,我使用了第二种方法,并在 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]

0 个答案:

没有答案