在父类中创建子类实例有问题。
这里是单例(父类)的定义。
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
这就是那个孩子
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”之前,我得到了错误的类型说明符。
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
你知道怎么回事吗?
发布于 2016-08-04 02: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
成为一个纯抽象类,并将工厂函数移到其他地方。也许用模板。
单身和继承很少在一起玩得好。
此外,如果您希望具有多个同时连接,怎么办?也许是不同类型的数据库?那么不能使用单例模式。
https://stackoverflow.com/questions/38764949
复制相似问题