2017-01-24 3 views
0

私は、MySQL-conntectorを使用してい++と私のようなポインタ型の行動のいくつかによって興味:sqlのクラスをネストされているネストされたクラスポインタの特殊な動作?

sql::Driver *driver__; 

または

sql::Connection *connection__; 

明らかに::Driver::Connection 、私はヒープ上のこれらのポインタのいずれかを初期化しようとするとき:

sql::Driver *driver__ {new sql::Driver()}; 

エラー:

error: invalid new-expression of abstract class type ‘sql::Driver’ 
    sql::Driver *driver__ {new sql::Driver()}; 

ライブラリはネストされたクラスとそのようなクラスへのポインタでこのタイプの動作をどのように実装しますか?

私はmysql-connector ++ソースコードを見てきましたが、関連するセクションを特定できないようです。

N.B上記のエラーは、基本クラスのサブオブジェクトとして存在する抽象クラスの-std=c++14

+2

私はmysql-connector ++を知らないが、 'sql :: Driver'は抽象クラス(少なくとも1つの純粋仮想関数を持つ)であるため、そのインスタンスを作成することはできません。これは、スコープに関係なく、一般的なクラスの場合に当てはまります。 –

+1

明らかに、ライブラリは派生クラスのオブジェクトを作成し、 '暗黙的に 'ポインタのアップキャストを使用して' sql :: Driver * 'にポインタを格納します。 –

+3

プログラムがコンパイルされた場合、変数名 'driver__'は、その名前が実装に予約されているため、プログラムに未定義の動作をさせます。別の変数名が必要です。 – user2079303

答えて

3

How do libraries implement this type of behavior with nested classes and pointers to such classes?

コンクリートインスタンスとCMakeの使用して製造されています。

struct MyDriver : sql::Driver { 
    //TODO implement all pure virtual functions of sql::Driver 
} 

// imaginary implementation 
Driver* get_driver_instance() { 
    static MyDriver instance; 
    return &instance; 
} 

PS:それらを作るための方法は、継承です。 Driversql(名前空間?)のメンバであるという事実は、名前検索に影響を与える方法を除いて、他の方法ではユーザにとって重要ではありません。ために

  • SQLドライバ
  • SQL接続

:あなたは

sql::Driver *driver__; 
sql::Connection *connection__; 

は、あなたがのインタフェースを実装インスタンスへの参照を宣言宣言実際に

0

、そのようなインスタンスをインスタンス化するために、この方法でライブラリはあなたに工場を提供します

driver__ = get_driver_instance(); 
connection__ = driver->connect("tcp://127.0.0.1:3306", "root", "root"); 

インスタンス化されると、そのようなインスタンスのパブリックインターフェイスのみを操作します。

関連する問題