2017-01-24 1 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

분명히 라이브러리는 파생 클래스의 객체를 만들고, 암시 적으로 포인터 업 캐스팅을 사용하여 포인터를'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"); 

인스턴스화되면 인스턴스의 공용 인터페이스 만 조작하게됩니다.