首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++单例在父类中创建子类

问c++单例在父类中创建子类
EN

Stack Overflow用户
提问于 2016-08-04 10:33:52
回答 1查看 355关注 0票数 0

在父类中创建子类实例有问题。

这里是单例(父类)的定义。

代码语言:javascript
复制
db.hpp
-------
#ifndef DB_HPP
#define DB_HPP

#include <string>
#include "mysqldb.hpp"

class Db
{
  public:
    static Db& instance()
    {
      // can be added other database implementations
      #ifdef DBMYSQL
        static Db *instance = new MySQLDb();
      #elseif DBORACLE
        //static Db *instance = new OracleDb();
      #endif
      return *instance;
    }

    virtual ~Db() {}
    virtual void Insert(std::string& query) = 0;
  protected:
    Db() {}
};
#endif // DB_HPP

这就是那个孩子

代码语言:javascript
复制
mysqldb.hpp
-----------
#ifndef MYSQLDB_HPP
#define MYSQLDB_HPP

#include "db.hpp"
#include <mysql.h>

class MySQLDb : public Db
{
  public:
    virtual void Insert(std::string& query);

  private:
    MYSQL *MySQLConnection_;
    MySQLDb();
    ~MySQLDb();
};
#endif // MYSQLDB_HPP

在“MySQLDb”之前,我得到了错误的类型说明符。

代码语言:javascript
复制
g++ -DDBMYSQL  `mysql_config --cflags` `mysql_config --libs` -DBOOST_LOG_DYN_LINK -std=c++11 -c -o mysqldb.o mysqldb.cpp

In file included from mysqldb.hpp:4:0,
             from mysqldb.cpp:1:
db.hpp: In static member function ‘static Db& Db::instance()’:
db.hpp:16:35: error: expected type-specifier before ‘MySQLDb’
     static Db *instance = new MySQLDb();
                               ^
Makefile:39: recipe for target 'mysqldb.o' failed

你知道怎么回事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-04 10:44:42

首先,您有一个循环依赖项(这是当前错误背后的原因):Db依赖于MySQLDb,依赖于Db,等等。

这很容易解决:在定义了"mysqldb.hpp"类之后包含Db头文件。然后将Db::instance的定义移出类之外,但请记住显式地标记它为inline。具有实现Db::instance函数的源文件,并且只在"db.hpp2"头文件中转发声明MySQLDb类,而不包括"mysqldb.hpp"文件。

这样做之后,您将遇到另一个问题,即MySQLDb构造函数是私有的,而Db类无法访问它。这可以通过使Db成为friend of MySQLDb来解决。

然而,所有这一切,循环依赖和使Db成为friend是一个糟糕的设计的标志,IMO。

相反,我可能会做一些事情,比如让Db成为一个纯抽象类,并将工厂函数移到其他地方。也许用模板。

单身和继承很少在一起玩得好。

此外,如果您希望具有多个同时连接,怎么办?也许是不同类型的数据库?那么不能使用单例模式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38764949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档