2016-08-04 3 views
0

부모 클래스에 자식 클래스의 인스턴스를 만드는 데 문제가 있습니다. 여기C++ singleton 부모 클래스에 자식 만들기

아이 싱글 (부모 클래스) 여기

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 

전 뭐가 잘못 됐는지 알아? DbMySQLDb에 따라 영원히 등 Db에 따라 달라집니다 : 모든

+0

순환 의존성이 있습니다. mysqldb.hpp에는 db.hpp가 포함되어 있습니다. 여기에는 db.hp가 포함되어 있습니다. – Garf365

+0

기본 클래스는 하위 클래스에 대해 알아야합니다. 어떤 것을 만들어. 자식 클래스는 생성 될 때 기본 클래스를 만들어야합니다. 그것은 싱글 톤을 제외하고는 불가능합니다. 그래서 아이도 싱글 톤이되어야합니다. 그리고 그 중 하나만 만듭니다. 나는 이것을 풀 수 있었다. 그러나 나는 차라리하지 않을 것입니다 : 기본 클래스가 싱글 톤이되는 (분명한) 이유가 없습니다. 네가 원하면 그냥 만들어라. 일반적으로 싱글 톤을 기본 클래스로 사용할 수 없습니다. – doctorlove

+0

db.hpp의 선언이 아닌 전체 파일을 포함해야합니까? – YiFei

답변

1

먼저 당신이 (당신이 얻을 현재 오류 뒤에 이유이다) 순환 종속성이 있습니다.

이 해결하는 것은 매우 쉽습니다

: 당신이 Db 클래스를 정의 후 "mysqldb.hpp" 헤더 파일 을 포함합니다. 그런 다음 Db::instance의 정의를 클래스 바깥으로 이동 시키되 명시 적으로는 inline으로 표시해야합니다. Db::instance 함수를 구현하는 소스 파일이 있고 헤더 파일에 MySQLDb 클래스 만 전달하면 "mysqldb.hpp" 파일은 포함되지 않습니다. 당신이 MySQLDb 생성자 개인이다 즉 것을, 또 다른 문제가되고 Db 클래스에 액세스 할 수없는 일을 한 후

. 이는 DbfriendMySQLDb으로 해결할 수 있습니다.


그러나이 모두 원형 의존성과 Dbfriend하기는 IMO, 나쁜 디자인의 표시이다.

순수 추상 클래스 인 Db을 대신 사용하여 다른 곳으로 팩토리 기능을 옮길 수도 있습니다. 어쩌면 템플릿을 사용합니다.

싱글 톤과 상속은 거의 잘 재생되지 않습니다.

또한 여러 개의 동시 연결을 원할 경우 어떻게해야합니까? 아마도 다른 종류의 다른 데이터베이스로? 그때 싱글 톤 패턴을 사용할 수 없습니다.

관련 문제