2016-08-04 2 views
0

親クラスに子クラスのインスタンスを作成する問題があります。私は 'MySQLdbは'C++ singleton親クラスの子を作成する

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 

前にエラーが期待タイプ指定子を得た。ここ

はシングルトンの定義(親クラス)

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 

ですあなたは何が間違っているか考えていますか?

+0

循環依存関係があります。mysqldb.hppにはdb.hppが含まれています。これにはdb.hpが含まれています。 – Garf365

+0

基本クラスは子クラスについて知る必要があります1つを作る。子クラスは構築時に基本クラスを作成する必要があります。それはシングルトンを除いて、そうすることはできません。だから、子供もシングルトンにする必要があります。そしてあなたはそれらのうちの1つだけを作ります。私はこれを解決することができた。しかし、私はむしろそうではありません。基底クラスがシングルトンである(明らかな)理由はありません。あなたがただ一つだけを望むならば、ただ一つ作ってください。一般的に、シングルトンを基本クラスとして使用することはできません。 – doctorlove

+0

db.hppの宣言だけでなく、ファイル全体を実際に含める必要がありますか? – YiFei

答えて

1

あなたは(あなたが得る現在エラーの背後にある理由である)、円形の依存関係を持っているまず第一に:Dbは永遠ようにDbに依存しているMySQLDbに依存します。

これは解決するのは非常に簡単です:あなたはDbクラスを定義し後"mysqldb.hpp"ヘッダファイルをインクルードし。その後、Db::instanceの定義をクラスの外に移動しますが、明示的にそれをinlineとマークすることを忘れないでください。 Db::instance関数を実装するソースファイルを持ち、ヘッダーファイルのMySQLDbクラスを前方に宣言するだけで、"mysqldb.hpp"ファイルは含まれません。あなたはMySQLDbコンストラクタがプライベートである、すなわちという、別の問題を持っていますし、Dbクラスがそれにアクセスできないことをやった後

。これは、DbfriendMySQLDbとすることで解決できます。


しかしこのすべては、循環依存関係とDbfriendを作るには悪いデザイン、IMOのサインです。

代わりにDbを純粋な抽象クラスにして、ファクトリ関数を別の場所に移動することがあります。たぶんテンプレートを使用しています。

シングルトンと継承はほとんど一緒に遊ぶことはほとんどありません。

さらに、複数の同時接続を希望する場合はどうすればよいですか?おそらく異なる種類の異なるデータベースに?その後、シングルトンパターンを使用することはできません。

関連する問題