嵌套 class 指针的特殊行为?
Peculiar behavior of nested class pointers?
我正在使用 mysql-conntector++,我对指针类型的某些行为很感兴趣,例如:
sql::Driver *driver__;
或
sql::Connection *connection__;
显然 ::Driver
和 ::Connection
嵌套在 sql
的 类 中,当我尝试在堆上初始化这些指针中的任何一个时:
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 以上错误是使用 CMake 和 -std=c++14
产生的
How do libraries implement this type of behavior with nested classes and pointers to such classes?
抽象 classes 的具体实例仅作为基础 class sub-object 存在。实现这些的方法是继承:
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。 Driver
是 sql
(命名空间?)的成员这一事实在其他方面对用户并不重要,除了它影响名称查找的方式。
事实上,当你声明时
sql::Driver *driver__;
sql::Connection *connection__;
您声明了对实现以下接口的实例的引用:
- 一个SQLdriver
- 一个SQL连接
为了实例化此类实例,库以这种方式为您提供工厂
driver__ = get_driver_instance();
connection__ = driver->connect("tcp://127.0.0.1:3306", "root", "root");
实例化后,您将只能操作此类实例的 public 接口。
我正在使用 mysql-conntector++,我对指针类型的某些行为很感兴趣,例如:
sql::Driver *driver__;
或
sql::Connection *connection__;
显然 ::Driver
和 ::Connection
嵌套在 sql
的 类 中,当我尝试在堆上初始化这些指针中的任何一个时:
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 以上错误是使用 CMake 和 -std=c++14
How do libraries implement this type of behavior with nested classes and pointers to such classes?
抽象 classes 的具体实例仅作为基础 class sub-object 存在。实现这些的方法是继承:
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。 Driver
是 sql
(命名空间?)的成员这一事实在其他方面对用户并不重要,除了它影响名称查找的方式。
事实上,当你声明时
sql::Driver *driver__;
sql::Connection *connection__;
您声明了对实现以下接口的实例的引用:
- 一个SQLdriver
- 一个SQL连接
为了实例化此类实例,库以这种方式为您提供工厂
driver__ = get_driver_instance();
connection__ = driver->connect("tcp://127.0.0.1:3306", "root", "root");
实例化后,您将只能操作此类实例的 public 接口。