繁体   English   中英

在MySQL Connector中使用智能指针

[英]Using smart pointers with MySQL Connector

大多数与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的指针,并且该指针可能不会被delete d。 因此,您不需要智能指针即可管理其使用寿命。 程序结束时,静态对象将被销毁。 需要删除帖子中的其他对象( sql::Connectionsql::Statementsql::ResultSet ),以便可以使用智能指针来管理这些对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM