将智能指针与 MySQL 连接器结合使用

Using smart pointers with MySQL Connector

本文关键字:结合 连接器 MySQL 智能 指针      更新时间:2023-10-16
大多数

与mysql连接器库相关的教程都假设用户将使用原始指针。我想改用智能指针。我写了以下类:

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无法"声明"驱动程序的析构函数,因为它受到保护(如错误中所述(。有什么解决方法吗?或者也许我应该在处理sql::Driver时简单地使用原始指针?

get_driver_instance() 生成的驱动程序对象指针是指向静态存储对象 AFAIK 的指针,该指针可能不是 d delete。因此,您不需要智能指针来管理其生命周期。程序结束时,静态对象将被销毁。帖子中的其他对象(sql::Connectionsql::Statementsql::ResultSet(需要删除因此,您可以使用智能指针来管理这些内容。