Ich habe ein Problem, Instanz der Kindklasse in Elternklasse zu erstellen.C++ Singleton Kind in Elternklasse erstellen
Hier Definition von Singleton (Elternklasse)
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
und hier ist das Kind
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
Ich habe Fehler erwarteten Typ-Spezifizierer vor '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
Hast du eine Ahnung, was los ist?
Sie haben eine zirkuläre Abhängigkeit mysqldb.hpp enthält db.hpp, die mysqldb.hpp enthält, die db.hp enthält .... keine andere Wahl als das Ändern Ihres Designs – Garf365
Die Basisklasse muss über die untergeordnete Klasse wissen mach eins. Die untergeordnete Klasse muss die Basisklasse erstellen, wenn sie erstellt wird. Außer es ist ein Singleton, also kannst du nicht. SO muss das Kind auch ein Singleton sein. Und du machst nur einen von denen. Ich könnte das lösen. Aber ich möchte lieber nicht: Es gibt keinen (offensichtlichen) Grund dafür, dass die Basisklasse ein Singleton ist. Wenn Sie nur einen wollen, machen Sie einen. Im Allgemeinen können Sie kein Singleton als Basisklasse verwenden. – doctorlove
Müssen Sie wirklich eine ganze Datei und nicht nur eine Deklaration in db.hpp einfügen? – YiFei