将智能指针与 MySQL 连接器一起使用
Using smart pointers with MySQL Connector
大多数与 mysql 连接器库相关的教程都假设用户将使用原始指针。我想改用智能指针。我写了以下 class:
class Database{
private:
bool _connected = false;
std::shared_ptr<sql::Driver> _driver;
std::shared_ptr<sql::Connection> _connection;
std::shared_ptr<sql::Statement> _statement;
std::shared_ptr<sql::ResultSet> _resource;
public:
Database();
~Database();
bool connect(const std::string &ip, const std::string &user, const std::string password);
bool connected();
};
我正在尝试实现 connect
功能,但在编译期间收到以下错误:
/usr/include/c++/5.3.0/ext/new_allocator.h:120:4: error: invalid new-expression of abstract class type ‘sql::Driver’
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
是下面一行代码引起的:
this->_driver = std::make_shared<sql::Driver>(get_driver_instance());
我做错了什么?我发现了几个带有智能指针的例子,但在每一个例子中, sql::Driver
实例都是一个原始指针。 get_driver_instance()
函数的结果不能赋值给智能指针吗?
更新:
我想我应该使用 reset
函数而不是 make_shared
模板。不幸的是:
this->_driver.reset(get_driver_instance());
没有解决问题,我得到这个错误:
/usr/include/cppconn/driver.h:39:10: error: ‘virtual sql::Driver::~Driver()’ is protected
virtual ~Driver() {}
我猜 shared_ptr
无法 "claim" Driver 的析构函数,因为它受到保护(如错误中所述)。有什么解决方法吗?或者也许我应该在处理 sql::Driver
?
时简单地使用原始指针
get_driver_instance()
生成的驱动程序对象指针是指向静态存储对象 AFAIK 的指针,该指针可能不是 delete
d。所以你不需要智能指针来管理它的生命周期。静态对象在程序结束时被销毁。 post(sql::Connection
、sql::Statement
、sql::ResultSet
)中的其他对象需要删除
所以你可以使用智能指针来管理它们。
大多数与 mysql 连接器库相关的教程都假设用户将使用原始指针。我想改用智能指针。我写了以下 class:
class Database{
private:
bool _connected = false;
std::shared_ptr<sql::Driver> _driver;
std::shared_ptr<sql::Connection> _connection;
std::shared_ptr<sql::Statement> _statement;
std::shared_ptr<sql::ResultSet> _resource;
public:
Database();
~Database();
bool connect(const std::string &ip, const std::string &user, const std::string password);
bool connected();
};
我正在尝试实现 connect
功能,但在编译期间收到以下错误:
/usr/include/c++/5.3.0/ext/new_allocator.h:120:4: error: invalid new-expression of abstract class type ‘sql::Driver’
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
是下面一行代码引起的:
this->_driver = std::make_shared<sql::Driver>(get_driver_instance());
我做错了什么?我发现了几个带有智能指针的例子,但在每一个例子中, sql::Driver
实例都是一个原始指针。 get_driver_instance()
函数的结果不能赋值给智能指针吗?
更新:
我想我应该使用 reset
函数而不是 make_shared
模板。不幸的是:
this->_driver.reset(get_driver_instance());
没有解决问题,我得到这个错误:
/usr/include/cppconn/driver.h:39:10: error: ‘virtual sql::Driver::~Driver()’ is protected
virtual ~Driver() {}
我猜 shared_ptr
无法 "claim" Driver 的析构函数,因为它受到保护(如错误中所述)。有什么解决方法吗?或者也许我应该在处理 sql::Driver
?
get_driver_instance()
生成的驱动程序对象指针是指向静态存储对象 AFAIK 的指针,该指针可能不是 delete
d。所以你不需要智能指针来管理它的生命周期。静态对象在程序结束时被销毁。 post(sql::Connection
、sql::Statement
、sql::ResultSet
)中的其他对象需要删除
所以你可以使用智能指针来管理它们。